【问题标题】:Unable to call a template member function of a template class from another template class无法从另一个模板类调用模板类的模板成员函数
【发布时间】:2013-05-04 02:13:54
【问题描述】:

我在尝试从另一个模板类中访问模板类的模板成员函数时遇到编译器错误。对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&lt;4, 4, float&gt; 而不是 Matrix&lt;4, 4, T&gt; 将导致有效编译。编译器是clang 4.0,语言版本是C++11。

【问题讨论】:

  • 非常感谢您的这篇文章,从 Clang 错误消息中推断出这个确实非常棘手。

标签: c++ templates


【解决方案1】:

你应该添加关键字template:

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

没有它,编译器会认为&lt;是一个比较运算符。

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

错误:&lt;unresolved overloaded function type&gt;int 类型的无效操作数转换为二进制 operator&lt;

【讨论】:

  • 天哪,C++ 模板语法如此直观。 讽刺>
  • 这几乎就像有人后来在制定语言规范时发明了模板语法方式......:P
  • Microsoft C++ 编译器在这种情况下做了“正确的事情”,即使它在技术上不应该这样做。将此答案添加为书签,因为它每隔几个月就会咬我一口。谢谢@awesoon!
猜你喜欢
  • 2010-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多