函数调用运算符的继承和重载

hel*_*vio 3 c++ inheritance operator-overloading

我在尝试从父结构继承函数调用操作符时遇到问题.我创建了一个简单的代码来说明我的问题:

#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;
};
Run Code Online (Sandbox Code Playgroud)

我希望'matrix'类从'array'类继承operator(),并用本地operator()重载它; 我希望这是因为参数的数量不同.但是,这段代码的编译失败了,例如"错误:不匹配调用'(矩阵)(int)'"和"注意:候选人需要2个参数,1提供".如果未在类'matrix'中定义operator(),则继承正常发生,并且代码编译并运行正常,如预期的那样.

我究竟做错了什么?我不想不必要地重新定义operator()......

Seb*_*edl 5

名称查找在C++中的工作方式,在编译器找到名称的那一刻,它就会停止查找.换句话说,编译器首先找到operator()in matrix并停止查找,永远不会找到array.

您可以operator()使用using声明明确地将base 带入范围:

template <...>
struct matrix : public array<...> {
  using array::operator();
  T& operator ()(int, int);
}
Run Code Online (Sandbox Code Playgroud)