0

J'écris des classes simples qui implémentent des vecteurs et des matrices dans le cadre d'une tentative d'apprentissage d'OpenGL. J'ai des classes de matrice et vecteur qui ressemblent à ceci:Pourquoi cette spécialisation partielle d'une fonction ami modèle fonctionne-t-elle?

// Forward declarations 
template <typename T, size_t N/*len*/> struct vec; 
template<typename T, size_t N /*rows*/, size_t M /*cols*/> struct mat; 

// Forward declare *operator for matrix 
// (NxM) matrix multiplied by (MxP) matrix yields (NxP) matrix 
mat<T, N, P> operator* (const mat<T, N, M>& A, const mat<T, M, P>& B); 

template <typename T, size_t N> 
struct vec { 
    public: 
     vec() {} 
     virtual ~vec() {} 
    private: 
     T[N] m_data; 
}; 

template <typename T, size_t N, size_t M> 
struct mat { 
    public: 
     mat() {} 
     virtual ~mat() {} 
     // This is where it gets interesting. By my reading of the rules 
     // of C++11, this counts as a partial specialization of the 
     // operator template, and should not work. 
     // However, it compiles just fine! 
     template <size_t n, size_t m, size_t p> 
     friend mat<T, n, p> operator* (const mat<T, n, m>& A, 
             const mat<T, m, p> &B); 
     // Implementation appears later in the same header file. 
    private: 
     T[N*M] m_data; 
}; 

Je déclare l'opérateur * comme un ami parce que je veux qu'il ait accès au membre m_data interne, mais je ne veux pas que les utilisateurs de « tapis 'et' vec 'pour connaître les internes.

Cela compile et fonctionne très bien. J'ai un test unitaire pour cette multiplication matricielle, et ça marche très bien. Cependant, je ne sais pas pourquoi il compile même, et encore moins court. En lisant les règles des templates C++, la déclaration de l'opérateur * compte comme une spécialisation partielle du template de fonction, et est illégale.

Qu'est-ce qui me manque ici?

+1

Veuillez ajouter le reste du code que vous avez utilisé pour créer le programme. –

Répondre

0

Il s'avère que cela ne fait * NOT * compiler. Je pensais qu'il compilait parce que je n'appelais pas l'opérateur de flux de modèles dans mon test unitaire quand je pensais que j'étais.

Désolé pour la question stupide!