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