c – 函数调用运算符的继承和重载
发布时间:2020-12-16 09:49:59 所属栏目:百科 来源:网络整理
导读:我在尝试从父结构继承函数调用操作符时遇到问题.我创建了一个简单的代码来说明我的问题: #include iostreamusing namespace std;template class T,int Nstruct array{ T value[N]; T operator() (int);};template class T,int NT arrayT,N::operator() (int
我在尝试从父结构继承函数调用操作符时遇到问题.我创建了一个简单的代码来说明我的问题:
#include <iostream> using namespace std; template <class T,int N> struct array { T value[N]; T& operator() (int); }; template <class T,int N> T& array<T,N>::operator() (int i) { return value[i]; } template <class T,int N> struct matrix: public array<T,N*N> { T& operator() (int,int); }; template <class T,int N> T& matrix<T,N>::operator() (int i,int j) { return this->value[i*N+j]; } int main() { matrix<double,100> a; a(0) = 3.5; cout << a(0) << endl; return 0; }; 我希望’matrix’类从’array’类继承operator(),并用本地operator()重载它;我希望这是因为参数的数量不同.但是,这段代码的编译失败了,例如“错误:不匹配调用'(矩阵)(int)’”和“注意:候选人需要2个参数,1提供”.如果未在类’matrix’中定义operator(),则继承正常发生,并且代码编译并运行正常,如预期的那样. 我究竟做错了什么?我不想不必要地重新定义operator()…… 解决方法
名称查找在C中的工作方式,在编译器找到名称的那一刻,它停止查找.换句话说,编译器首先在矩阵中找到operator()并停止查找,从不在数组中找到它.
您可以使用using声明显式地将base operator()带入作用域: template <...> struct matrix : public array<...> { using array::operator(); T& operator ()(int,int); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |