无法从另一个模板类调用模板类的模板成员函数

Unable to call a template member function of a template class from another template class

本文关键字:成员 函数 调用 另一个      更新时间:2023-10-16

当我试图从另一个模板类中访问模板类的模板成员函数时,会遇到编译器错误。对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)
    {
        ...
    }
};

转换类:

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>将导致有效编译。编译器是clang 4.0,语言版本是C++11。

您应该添加关键字template:

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

如果没有它,编译器会认为<是一个比较运算符。

PS。在这种情况下,g++会产生一个更容易理解的错误:

错误:类型<unresolved overloaded function type>int到二进制operator< 的操作数无效