【问题标题】:Inheritance and overloading of the function call operator函数调用运算符的继承与重载
【发布时间】:2014-01-16 17:23:33
【问题描述】:

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

#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()重载它;我希望这是因为参数的数量不同。但是,此代码的编译失败并显示诸如“错误:不匹配调用‘(matrix) (int)’”和“注意:候选人需要 2 个参数,提供 1 个”之类的消息。如果 operator() 没有在类 'matrix' 中定义,则继承正常发生,代码编译并运行良好,如预期的那样。

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

【问题讨论】:

    标签: c++ inheritance operator-overloading


    【解决方案1】:

    名称查找在 C++ 中的工作方式,当编译器找到名称时,它会停止查找。换句话说,编译器首先在matrix 中找到operator(),然后停止查找,永远不会在array 中找到那个。

    您可以使用 using 声明明确地将基础 operator() 纳入范围:

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

    【讨论】:

    • 你打败了我。这是对主题parashift.com/c++-faq-lite/hiding-rule.html的一个很好的解释
    • 比这要复杂一些(虽然这里是解释)。例如,可以通过 ADL 引入其他名称;编译器不会在找到名称后立即停止。
    • 正确,但不适用于类成员查找。
    • 谢谢,塞巴斯蒂安!我不知道我能做到这一点。并感谢 PorkyBrain 的参考。只是为了严格正确,相关行必须包含模板参数: using array<...>::operator();
    • 改用using matrix::array::operator()。使您免于重复模板参数。虽然两者都是完全有效的。
    【解决方案2】:

    通过在派生类中重载基类函数,您可以隐藏基类函数。要访问基类函数,您必须在派生类中重新定义基类函数“T& operator() (int)”,也可以使用“using array::operator();”。

    【讨论】:

      【解决方案3】:

      当您声明具有给定名称的成员函数时,它将屏蔽所有具有相同名称的继承函数。这意味着默认情况下它不会重载它们,即使有不同数量的参数,或者它们属于不同的类型等。

      但是,您可以使用using 声明将基类函数带入子类的作用域。在你的情况下,把它放在你的 matrix 类中的某个地方:

      using array<T, N*N>::operator ();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-05
        • 1970-01-01
        • 1970-01-01
        • 2012-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多