2013-05-04 18 views
6

Ricevo errori del compilatore quando si tenta di accedere a una funzione membro modello di una classe modello da un'altra classe modello. Una chiamata di funzione a getSubmatrix genera negli avvisi del compilatore "espressione risultato inutilizzato", sui parametri (0, 0), infine non riesce con l'errore del compilatore "il riferimento alla funzione membro non statico deve essere chiamato".Impossibile chiamare una funzione membro modello di una classe modello da un'altra classe modello

classe Matrix:

template <std::size_t m, std::size_t n, typename T, std::size_t rowPadding = 0> 
class Matrix 
{ 
public: 
    ... 

    template <std::size_t p, std::size_t q> 
    Matrix<p, q, T, n - q>& getSubmatrix(std::size_t column, std::size_t row) 
    { 
     ... 
    } 
}; 

L'trasformare classe:

template <typename T> 
class Transform 
{ 
public: 
    ... 

    Matrix<4, 4, T> matrix() const 
    { 
     ... 

     Matrix<4, 4, T> result; 
     result.getSubmatrix<3, 3>(0, 0) = Matrix<3, 3, T>(); 

     ... 
    } 
}; 

Nota che cambiando il tipo di matrice per Matrix<4, 4, float> piuttosto che Matrix<4, 4, T> si tradurrà in compilation valido. Il compilatore è clang 4.0 e la versione della lingua è C++ 11.

+1

La ringrazio molto per questa voce, questo era estremamente difficile da dedurre dal messaggio di errore Clang davvero. –

risposta

12

Si dovrebbe aggiungere parola chiave template:

result.template getSubmatrix<3, 3>(0, 0) = Matrix<3, 3, T>(); 
//  ^^^^^^^^ 

Senza di essa, compilatore penserà che < è un operatore di confronto.

PS. In tal caso, g ++ produce un piccolo errore più comprensibile:

error: invalid operands of types <unresolved overloaded function type> and int to binary operator<

+0

Grazie mille! –

+2

Gosh, la sintassi del template C++ è così intuitiva.

+0

È quasi come se qualcuno avesse inventato la sintassi del modello in un secondo momento per rendere le specifiche della lingua ...: P –

Problemi correlati