2010-10-04 5 views
0

J'ai une classe de modèle que j'essaie de instancier explicitement:C modèle explicite de l'instanciation d'un opérateur

template<T> 
struct tmat2x3 
{ 
... 
typedef tvec3<T> col_type; 
.. 
}; 

l'opérateur est déclaré comme suit:

template <typename T> 
typename tmat2x3<T>::row_type operator* (tmat2x4<T> const & m, typename tmat2x3<T>::col_type const & v); 

Je suis l'instanciation explicitement l'opérateur en utilisant ce qui suit:

template tmat2x3<unsigned char>::row_type operator * (tmat2x3<unsigned char> const &m, tmat2x3<unsigned char>::col_type const &s); 

gcc me donne l'erreur suivante cependant:

../glm/glm_core.cpp: In instantiation of ‘typename glm::detail::tmat2x3<T>::row_type glm::detail::operator*(const glm::detail::tmat2x3<T>&, const typename glm::detail::tmat2x3<T>::col_type&) [with T = unsigned char]’: 
../glm/glm_core.cpp:443: instantiated from here 
../glm/glm_core.cpp:443: error: explicit instantiation of ‘typename glm::detail::tmat2x3<T>::row_type glm::detail::operator*(const glm::detail::tmat2x3<T>&, const typename glm::detail::tmat2x3<T>::col_type&) [with T = unsigned char]’ but no definition available 

Une idée de ce que je fais mal?

Merci à l'avance

+0

Avez-vous le corps off opérateur disponible lorsque vous instantiated explicitement? – Anycorn

+2

Vous nous avez montré la déclaration, mais le compilateur se plaint de la définition. Comment définissez-vous le modèle? – Potatoswatter

Répondre

0

Le code suivant ne compile sur VS2008. Je crois que le problème est le mauvais identifiant tmat2x4 que nous pouvons voir sur votre déclaration d'opérateur.

template < typename T > struct tmat2x3{ 
    typedef vector<T> col_type; 
}; 

template <typename T> typename tmat2x3<T>::col_type operator* (tmat2x3<T> const & m, typename tmat2x3<T>::col_type const & v); 

template <> tmat2x3<unsigned char>::col_type operator * (tmat2x3<unsigned char> const &m, tmat2x3<unsigned char>::col_type const &s){ 
    return tmat2x3<unsigned char>::col_type(); 
} 

int main(int argc, char ** argv){ 
    tmat2x3<unsigned char> blah; 
    blah * vector<unsigned char>(); 
    return 0; 
} 
+0

J'ai corrigé la faute de frappe, mais votre code ne force pas une instanciation de modèle autonome, il agit seulement comme un modèle régulier. – kinzeron

+2

C'est une spécialisation, pas une instanciation. – Potatoswatter

0

Je pense que ce qui se passe est que vous instancier explicitement, mais le compilateur est à la recherche dans les en-têtes et ne peux pas trouver le code qui devrait s'instancié. Regardez pour voir que l'opérateur est réellement implémenté pour ce type.

0

En effet, le problème était avec la définition, maintenant c'est la compilation ok.

Questions connexes