2013-05-04 18 views
6

Otrzymuję komunikat o błędzie kompilatora podczas próby uzyskania dostępu do funkcji składowej szablonu klasy szablonu z poziomu innej klasy szablonu. Wywołanie funkcji do getSubmatrix powoduje ostrzeżenia kompilatora, "wynik wyrażeń nieużywany", o parametrach (0, 0), aw końcu błąd kompilatora "odwołanie do niestatycznej funkcji składowej musi być wywołane".Nie można wywołać funkcji składowej szablonu klasy szablonu z innej klasy szablonu

Klasa 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) 
    { 
     ... 
    } 
}; 

Transformacja klasa:

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>(); 

     ... 
    } 
}; 

Należy pamiętać, że zmieniając typ matrycy do Matrix<4, 4, float> zamiast Matrix<4, 4, T> spowoduje ważnej kompilacji. Kompilatorem jest clang 4.0, a wersją językową jest C++ 11.

+1

Bardzo dziękuję za ten wpis, ten był bardzo trudny do wyciągnięcia z komunikatu o błędzie Clang. –

Odpowiedz

12

Należy dodać słowa kluczowego template:

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

Bez niego kompilator będzie myśleć, że < to operator porównania.

PS. W takim przypadku g ++ daje nieco bardziej zrozumiały błąd:

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

+0

Dziękuję bardzo! –

+2

Gosh, składnia szablonu C++ jest tak intuicyjna.

+0

To prawie tak, jak ktoś wymyślił składnię szablonów później, tworząc specyfikację językową ...: P –

Powiązane problemy