繁体   English   中英

模板化类参数重载

[英]Templated class parameter overloading

我试图解决为什么尝试编译这个问题

#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<1,1>& other)但我认为另一个应该解析为double dotProd(const Matrix<1,32>& other) ,而不是Matrix<1,1>

这里发生了什么?

当你这样做:

bob.dotProd(fred)

dotProd函数被实例化以解析对Matrix<1,32>的调用。
我们可以这么说(免责声明:它不是它的工作方式,但是它提供了引擎盖下发生的事情的概念)它们最终被声明为:

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

忽略第一个,让我们专注于第二个。 它需要Matrix的新特化,即: Matrix<1,1>
如果考虑这样的专业化,如果用实际值替换模板参数,你将获得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;

COLS ,在COLSROWS相等的情况下,您的类模板Matrix ROWS不正确。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM