这是Visual 2010的编译错误吗?

时间:2012-05-09 20:07:43

标签: c++ visual-studio-2010 visual-studio-2008 visual-c++

class Base {
public:
    virtual void myFunc(double a, double b) { };
    virtual void myFunc(double a) { };

};

class Derived : public Base {
public:
    virtual void myFunc(double a) { return this->myFunc(a, 0.0); };
};                                      // ^^^^^^^^^^^^^^^^^^^^

以前的代码无法编译:{{1​​}} 显然,编译器无法看到我正在尝试调用Base类中定义的函数,或者任何覆盖它的函数。另一方面,以下代码编译好了:

error C2660: 'Derived::myFunc' : function does not take 2 arguments

我认为我在第一个例子中尝试做的是合法的C ++,这是VS2010编译器中的一个错误吗?我对VS2008有相同的结果

感谢

编辑:我找到的解决方法是使用

class Base {
public:
    virtual void myFunc2(double a, double b) { };
    virtual void myFunc(double a) { };

};

class Derived : public Base {
public:
    virtual void myFunc(double a) { return this->myFunc2(a, 0.0); };
};

但我不是100%确定它具有完全相同的效果,有人可以确认吗?

2 个答案:

答案 0 :(得分:7)

此行为是设计使然。

派生类hide other overloads in the base class中的函数。

答案 1 :(得分:0)

这不是错误。

您可以选择C ++中是否应隐藏继承的重载(这是更安全的默认行为)还是可用的:

class Derived : public Base {
public:
    virtual void myFunc(double a) { return this->myFunc(a, 0.0); };
    using Base::myFunc;
};

或者,您可以在函数调用时使用Base::myFunc语法。

D&E,第17.4.5.3节和第17.5节中,对名称空间和重载之间的交互的默认行为进行了解释。假设Base是库类,而Derived是您的应用程序代码。该库的下一个版本肯定会为许多函数带来新的重载,甚至可能是myFunc,你肯定不希望你经过良好测试的程序静默重新绑定其myFunc调用其他重载并调用其他函数