IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

std::auto_ptr versus std::unique_ptr


Sujet :

C++

  1. #1
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut std::auto_ptr versus std::unique_ptr
    Salut,

    Afin de résoudre le problème std::auto_ptr versus std::unique_ptr j'ai ceci dans le code d'une lib que je maintiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #if __cplusplus >= 201103L
    template <typename T>
    using AutoPtr = std::unique_ptr<T>;
    #else
    using AutoPtr = std::auto_ptr;
    #endif
    J'ai toutefois un utilisateur qui me communique cette erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
        In file included from src/exiv2wrapper.cpp:27:0:
        src/exiv2wrapper.hpp:274:19: error: ‘AutoPtr’ in ‘class Exiv2::Image’ does not name a type
             Exiv2::Image::AutoPtr _image;
                           ^~~~~~~
    avec cette version de gcc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    gcc --version
    gcc-7.3.1-13.amzn2.x86_64
    qui semble être une version spécifique à "AMAZON linux" (Ne me demandez pas ce qu'est ce truc ...)

    Cela dit, moi je n'ai aucun problème et cette lib est distribuée avec compilation lors de l'installation par l'utilisateur avec un peu plus de 2.500 installations par mois.

    Une idée ?

  2. #2
    Membre éprouvé
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 562
    Points : 1 253
    Points
    1 253
    Par défaut
    Salut,

    Le problème c'est qu'après ta directive #else tu continues à coder en C++11 (utilisation d'using au lieu de typedef).
    Cela dit, tenter de faire cohabiter deux dialectes assez différents c'est un peu casse-gueule.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    Pareil, je ne comprends pas comment ce AutoPtr peut fonctionner non plus.
    Dans la version pré-c++11, il n'y a pas de paramètre template, vu que c'était impossible. Donc ça crée un type AutoPtr, mais ça prend jamais en compte le fait que ce soit template. Donc ça fait quoi ? Ça déclare un type incomplet ? Et donc inutilisable ?
    Et définir un alias avec using, c'est pas une feature C++11 de toute façon ?
    Pour moi, la version pré11 devrait faire un #define AutoPtr std::auto_ptr pour que la syntaxe AutoPtr<Toto> devienne std::auto_ptr<Toto>.

    Au pire, tu vas devoir fournir une implémentation par défaut.
    Au lieu d'utiliser std::auto_ptr, AutoPtr devient une petite classe template qui réintroduit son fonctionnement.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    Merci pour les retours.
    Effectivement ce devait être #define AutoPtr std::auto_ptr.
    En fait ce bloc conditionnel a été rajouté récemment pour supprimer des warnings de dépréciation de std::auto_ptr de certains compilateurs.

    Mais à la réflexion, je pense plus simple d'imposer -std=c++11 pour la compile.
    Je l'ai testé avec gcc sans problème et je vais le faire avec clang plus tard, mais je pense que ça ne devrait pas causer de soucis non plus.

  5. #5
    Membre éprouvé
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 562
    Points : 1 253
    Points
    1 253
    Par défaut
    Plutôt C++14, qui corrige bon nombre de problèmes de C++11.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 52
    Dernier message: 23/10/2014, 12h22
  2. Réponses: 19
    Dernier message: 29/09/2014, 18h12
  3. Réponses: 31
    Dernier message: 19/09/2014, 21h40
  4. Intérêt de std::unique_ptr
    Par Freem dans le forum SL & STL
    Réponses: 20
    Dernier message: 15/08/2012, 21h33
  5. boost::serialization et std::unique_ptr
    Par Freem dans le forum Boost
    Réponses: 7
    Dernier message: 09/08/2012, 16h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo