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