2013-05-04 14 views
6

別のテンプレートクラス内からテンプレートクラスのテンプレートメンバー関数にアクセスしようとすると、コンパイラエラーが発生します。 getSubmatrixへの関数呼び出しでは、パラメータ(0, 0)に関するコンパイラの警告「式の結果は未使用」になり、最終的にコンパイラエラー「非静的メンバ関数への参照を呼び出す必要があります。別のテンプレートクラスからテンプレートクラスのテンプレートメンバー関数を呼び出すことができません

行列クラス:

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

変換クラス:Matrix<4, 4, float>ではなくMatrix<4, 4, T>にマトリックスタイプを変更すると、有効なコンパイルをもたらすこと

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

     ... 
    } 
}; 

注意。コンパイラはclang 4.0、言語バージョンはC++ 11です。

+1

このエントリは大変ありがとうございます。これは本当にClangのエラーメッセージから推測するのが非常に難解でした。 –

答えて

12

あなたがキーワードtemplate追加する必要があります。それがなければ

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

を、コンパイラは<は、比較演算子だと思います。

PS。その場合、g ++は少しわかりやすいエラーを生成します。

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

+0

ありがとうございました! –

+2

Gosh、C++のテンプレート構文はとても直感的です。

+0

後で誰かが言語仕様を作成するときにテンプレート構文を作り出すのはほぼ間違っています。:P –

関連する問題