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
	
	| 12
 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
	
	| 12
 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
	
	| 12
 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
	
	| 12
 
 |  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
	
	| 12
 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
	
	| 12
 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
	
	| 12
 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