J'ai une classe de modèle avec une fonction de membre de modèle. Je veux instancier explicitement la classe pour éviter un ralentissement drastique de la compilation. J'utilise g ++ 4.1.2. Je reçois des erreurs de spécialisation de modèle ambigu du compilateur. Ce code le plus court qui reproduira le problème:Instanciation de modèle explicite avec la fonction de modèle de membre
template <class T, class S >
class Test
{
public:
template< typename T1 >
void* get(const T1&);
void* get(const int&); //Specialization of the above
};
typedef Test<int, double> foo;
//instantiate
inline template class Test<int, double>;
template void* foo::get(int const&);
Je ne veux pas utiliser un fourre-tout:
template class Test<int, double>
parce que le get de surcharge (const int &) ne sera pas défini pour Toutes les instanciations explicites possibles et donc le compilateur jettera un ajustement pour les types qui ne le supportent pas.
Ce code est compilé dans Visual Studio (sans le modèle précédent en ligne, qui est une extension spécifique de gcc). Quelqu'un peut-il jeter un peu de lumière sur la façon dont je compile ce fragment de code?
MISE À JOUR: Ce est l'erreur que je reçois:
g++ -c -o template.o template.cpp
template.cpp:14: error: ambiguous template specialization ‘get<>’ for ‘void* Test<int, double>::get(const int&)’
template.cpp:7: error: candidates are: void* Test<T, S>::get(const int&) [with T = int, S = double]
template.cpp:6: error: template<class T1> void* Test::get(const T1&) [with T1 = T1, T = int, S = double]
MAJ2: Merci pour la solution, il ne compile pas bien. Les spécialisations ne sont pas autorisées dans une classe. L'erreur est:
g++ -c -o template.o template.cpp
template.cpp:7: error: explicit specialization in non-namespace scope ‘class Test<T, S>’
template.cpp:7: error: enclosing class templates are not explicitly specialized
template.cpp:8: error: ‘get’ is not a template function
template.cpp: In instantiation of ‘void* Test<T, S>::get(const T1&) [with T1 = int, T = int, S = double]’:
template.cpp:15: instantiated from here
template.cpp:15: error: explicit instantiation of ‘void* Test<T, S>::get(const T1&) [with T1 = int, T = int, S = double]’ but no definition available
make: *** [template.o] Error 1
Est-ce que 'foo' est censé être' Test'? Pouvez-vous poster l'erreur réelle et la ligne à laquelle elle fait référence? –
J'ai typedef'd truc pour une saisie facile. L'erreur réelle est: g ++ -c -o template.o template.cpp template.cpp: erreur: spécialisation de modèle ambigu 'get <>' pour 'void * Test :: get (const int &)' template .cpp: 7: erreur: les candidats sont: void * Test :: get (const int &) [avec T = int, S = double] template.cpp: 6: erreur: modèle void * Test :: get (const T1 &) [avec T1 = T1, T = int, S = double] –
Venkatesan
Oups, je n'ai pas vu ce 'typedef', désolé. –