2013-05-04 117 views
6

尝试从另一模板类中访问模板类的模板成员函数时出现编译器错误。对getSubmatrix的函数调用导致编译器警告“表达式结果未使用”,有关参数(0, 0),最终因编译器错误而失败“必须调用对非静态成员函数的引用”。无法从另一个模板类中调用模板类的模板成员函数

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

变换类:

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

     ... 
    } 
}; 

注意改变矩阵类型Matrix<4, 4, float>而非Matrix<4, 4, T>将导致有效的汇编。编译器是铛4.0,语言版本是C++ 11。

+1

非常感谢您对此条目的评价,这实在是非常棘手的。 – 2014-08-27 15:05:37

回答

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

非常感谢! – 2013-05-04 02:46:13

+2

Gosh,C++模板语法非常直观。 2015-01-14 15:52:11

+0

这几乎就像有人在制作语言规范后发明了模板语法方法...:P – 2016-01-14 16:17:54