【问题标题】:Templated class parameter overloading模板类参数重载
【发布时间】:2017-07-17 16:45:43
【问题描述】:

我想弄清楚为什么在编译时会出现问题

#include <iostream>
template <unsigned int ROWS,unsigned int COLS>
class Matrix{
    public:
        double dotProd(const Matrix<1,COLS>& other){
            static_assert(ROWS==1,"dotProd only valid for two vectors");
            return COLS;//place holder for dot product with row vectors
        }
        double dotProd(const Matrix<ROWS,1>& other){
            static_assert(COLS==1,"dotProd only valid for two vectors");
            return ROWS;//place holder for dot product with col vectors
        }
};
int main(){
    Matrix<1,32> bob;
    Matrix<1,32> fred;
    std::cout<<bob.dotProd(fred)<<std::endl;
    return 0;
}

这给了我这个错误:

overloadedTemplateMethod2.cpp: In instantiation of ‘class Matrix<1u, 1u>’:
overloadedTemplateMethod2.cpp:17:32:   required from here
overloadedTemplateMethod2.cpp:9:16: error: ‘double Matrix<ROWS,COLS>::dotProd(const Matrix<ROWS, 1u>&) [with unsigned int ROWS = 1u; unsigned int COLS = 1u]’ cannot be overloaded
     double dotProd(const Matrix<ROWS,1>& other){
            ^
overloadedTemplateMethod2.cpp:5:16: error: with ‘double Matrix<ROWS, COLS>::dotProd(const Matrix<1u, COLS>&) [with unsigned int ROWS = 1u; unsigned int COLS = 1u]’
     double dotProd(const Matrix<1,COLS>& other){
            ^

我知道填写参数的模板会导致第二个函数解析为double dotProd(const Matrix&lt;1,1&gt;&amp; other),但我认为另一个应该解析为double dotProd(const Matrix&lt;1,32&gt;&amp; other),而不是再次解析为Matrix&lt;1,1&gt;

这是怎么回事?

【问题讨论】:

    标签: c++ templates overloading


    【解决方案1】:

    当你这样做时:

    bob.dotProd(fred)
    

    dotProd 函数被实例化以解决对Matrix&lt;1,32&gt; 的调用。
    我们可以这样说(免责声明:它不完全是这样工作的,但它给出了幕后发生的事情的想法)它们最终被声明为:

    double dotProd(const Matrix<1,32>& other);
    double dotProd(const Matrix<1,1>& other);
    

    忽略第一个,让我们专注于第二个。它需要Matrix 的新特化,即:Matrix&lt;1,1&gt;
    如果您考虑这样的特化,如果您将模板参数替换为实际值,您会为dotProd 获得什么声明?

    double dotProd(const Matrix<1,1>& other); // Matrix<1, COLS>
    double dotProd(const Matrix<1,1>& other); // Matrix<ROWS, 1>
    

    也就是说,你最终声明了一个在参数列表中没有区别的重载函数。因此错误。

    如果您将 main 函数的主体替换为以下行,则会得到完全相同的错误:

     Matrix<1,1> someone;
    

    换句话说,在COLSROWS 相等的情况下,您的类模板Matrix 格式不正确。

    【讨论】:

    • 所以你的意思是,当第二个函数的参数解析为 Matrix 时,必须生成该类,因为它与导致问题的那些参数不正确?
    • @Austin_Anderson 是的。我会说这或多或少会发生什么。错误消息实际上提到了 Matrix&lt;1,1&gt; 类型以及错误。
    • 酷我只是想揭开错误消息的神秘面纱,并且很好地清除了它,我想我的下一步是使这些函数模板和 static_assert 参数等于相应的类参数
    • 该死,这确实是发生了什么,非常非常好的答案!没有意识到Matrix&lt;1,1&gt; 的论点本身是错误的。我等待这个问题的答案将近 8 个小时 :)
    猜你喜欢
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多