加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读