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 :
	
	error C2514: 'boost::shared_ptr<TemplateClass<T1,T2>>' : class has no constructors
 Voici le code :
Crach.h
	
	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
	
	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
	
	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
	
	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
	
	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
	
	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
	
	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
						
					
Partager