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

Boost C++ Discussion :

[template] 'boost::shared_ptr<TemplateClass<T1, T2> > has no constructors'


Sujet :

Boost C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Par défaut [template] 'boost::shared_ptr<TemplateClass<T1, T2> > has no constructors'
    Bonjour,
    Je viens vous présenter un petit soucis. J'ai réussi à séparrer le problème de mon projet et de le recréer en dehors pas très simple car c'est un paquet de noeud immense (un gros projet quoi )
    Le code fourni ne compil pas et donne comme erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2514: 'boost::shared_ptr<TemplateClass<T1,T2>>' : class has no constructors
    Voici le code :
    Crach.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #ifndef CRASH
    #define CRASH
    template <class T>
    class Container
    {
        public :
            explicit Container();
            T* pT;      
    };
    
    template <class T1, class T2>
    class Truc
    {
        public :
            Truc(); 
            T1* pT1;
            T2* pT2;    
    };
    
    template <class T1, class T2> 
    class TemplateClass
    {
        public :
            TemplateClass();
    };
    
    class TestClass
    {  
        public :
            // ***
            template<class T1, class T2> void TestFunction(const boost::shared_ptr<TemplateClass<T1, T2> >& pTemplateClass = boost::shared_ptr<TemplateClass<T1, T2> >());
            void Test();
    
    };
    #include "Crach.inl"
    #endif
    Crach.inl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    template<class T> Container<T>::Container()
    {
     
    }
     
    template<class T1, class T2>
    TemplateClass<T1, T2>::TemplateClass()
    {
     
    }
     
    template<class T1, class T2>
    void TestClass::TestFunction(const boost::shared_ptr<TemplateClass<T1, T2> >& pTemplateClass)
    {
     
    }
    Crach.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include "stdafx.h"
    #pragma hdrstop
    #include "Crach.h"
    void TestClass::Test()
    {
            this->TestFunction<int, float>();
    }
    et on utilise ça comme ça dans un endroit où on a inclue Crach.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     TestClass Test;
     Test.Test();
    L'erreur que me donne le compilateur est sous la ligne avec *** dans Crach.h
    Passons encore un cran de plus vers le domaine de l'étrange :
    Maintenant on va se servir de la class Container.
    Modifions le code un peu : (en faite on remplace boost::shared_ptr par Container)
    Crach.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #ifndef CRASH
    #define CRASH
    template <class T>
    class Container
    {
        public :
            explicit Container();
            T* pT;      
    };
    
    template <class T1, class T2>
    class Truc
    {
        public :
            Truc(); 
            T1* pT1;
            T2* pT2;    
    };
    
    template <class T1, class T2> 
    class TemplateClass
    {
        public :
            TemplateClass();
    };
    
    class TestClass
    {  
        public :
            // ***
            template<class T1, class T2> void TestFunction(const Container<TemplateClass<T1, T2> >& pTemplateClass = Container<TemplateClass<T1, T2> >());
            void Test();
    
    };
    #include "Crach.inl"
    #endif
    Crach.inl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    template<class T> Container<T>::Container()
    {
     
    }
     
    template<class T1, class T2>
    TemplateClass<T1, T2>::TemplateClass()
    {
     
    }
     
    template<class T1, class T2>
    void TestClass::TestFunction(const Container<TemplateClass<T1, T2> >& pTemplateClass)
    {
     
    }
    Crach.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include "stdafx.h"
    #pragma hdrstop
    #include "Crach.h"
    void TestClass::Test()
    {
            this->TestFunction<int, float>();
    }
    On compil et la surprise il n'y a plus d'erreur.

    Alors voici le moment tant attendu des questions :
    -> Pourquoi dans le premier cas ça marche pas ?
    -> Si vous avez répondu avec succès à la première question, pourquoi ça marche dans le second cas ?

    Pistes :
    -> Le problème vient du paramètre par défaut.
    -> Si à la place d'utiliser TemplateClass on utilise une class non template, alors ça compile dans le premier et le second cas !!
    -> Je me suis déjà pris la tête pendant pas mal de temps dessus.
    -> J'ai cherché sur google [C2514 "has no constructors"] => pas de réponse satisfaisante.
    -> On pourrai penser que ça vient de la class shared_ptr mais j'ai beaucoup de mal à voir où...
    Merci d'avance.

    Le code fourni compil, vous pouvez copier/coller/tester

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Première question :
    Pourquoi mettre le code dans Crash.cpp plutôt que dans l'en-tête comme préconisé fortement dans la FAQ ?

  3. #3
    Membre chevronné Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Par défaut
    Je vois ce que tu veux dire, en fait dans mon projet, il n'y a pas de Crach.cpp mais un Crach.inl et à la fin de Crach.h il y a un #include "Crach.inl". Pour isoler le problème j'ai du virer du code et faire petit à petit un exemple qui arrivait à recréer le problème...
    Mais ma question n'est pas là...
    Je vais modifier comme ça, ça sera plus clair.

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Et si tu remplaces boost::shared_ptr par Container, ça passe, c'est ça ?

  5. #5
    Membre chevronné Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Par défaut
    Oui c'est tout à fait ça.

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    As-tu essayé en mettant le corps des fonctions dans la déclaration des classes ?

Discussions similaires

  1. Réponses: 8
    Dernier message: 25/03/2008, 21h59
  2. Copie de boost::shared_ptr
    Par Kurisu dans le forum Boost
    Réponses: 2
    Dernier message: 07/09/2006, 15h29
  3. [BOOST] shared_ptr et void*
    Par bourrik dans le forum Bibliothèques
    Réponses: 16
    Dernier message: 16/06/2006, 17h12
  4. boost::shared_ptr et singletons
    Par Elendil_BzH dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 15/01/2006, 20h45
  5. [BOOST] shared_ptr et pointer C
    Par zdra dans le forum Bibliothèques
    Réponses: 7
    Dernier message: 08/05/2005, 14h15

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