这是 Visual 2010 的编译错误吗?
Posted
技术标签:
【中文标题】这是 Visual 2010 的编译错误吗?【英文标题】:is this a compilation bug of Visual 2010? 【发布时间】:2012-05-09 20:07:43 【问题描述】: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); ;
; // ^^^^^^^^^^^^^^^^^^^^
前面的代码无法编译:error C2660: 'Derived::myFunc' : function does not take 2 arguments
显然编译器看不到我正在尝试调用基类中定义的函数,或任何覆盖它的函数。另一方面,以下代码编译正常:
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); ;
;
我认为我在第一个示例中尝试做的是合法的 C++,那么这是 VS2010 编译器中的错误吗?我用 VS2008 也有同样的结果
谢谢
编辑:我发现的一种解决方法是使用
virtual void myFunc(double a) return ((Base*)this)->myFunc(a, 0.0); ;
但我不能 100% 确定它具有完全相同的效果,有人可以确认吗?
【问题讨论】:
尝试在课程开头添加using Base::myFunc
Derived
。
Why does an overridden function in the derived class hide other overloads of the base class?的可能重复
【参考方案1】:
此行为是设计使然。
派生类hide other overloads in the base class中的函数。
【讨论】:
所以这不会在其他任何东西上编译?我不确定我是否看到了这个限制的意义 @lezebulon:正确。我不知道为什么这是真的。 你能说得更具体点吗?我希望这两个重载都是候选函数,只有双参数一个是可行的函数,因此它将是最好的可行函数。我错过了什么? @JirkaHanika:由于派生类函数,所有基类重载都被隐藏了。 我将冒险进行部分解释。假设Base
是一个库类,而Derived
是您的应用程序代码。该库的下一个版本肯定会为许多函数提供新的重载,甚至可能是myFunc
,并且您当然不希望您经过良好测试的程序静默地将其myFunc
调用重新绑定到其他重载并调用其他东西。 (同样请注意,C++ 在重载解析期间会忽略访问控制(私有/受保护/公共),因此将私有成员设为公共或反之亦然不会默默地和巧妙地改变格式良好的程序的语义。)【参考方案2】:
这不是错误。
您可以在 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
调用重新绑定到其他重载并调用其他内容。
【讨论】:
以上是关于这是 Visual 2010 的编译错误吗?的主要内容,如果未能解决你的问题,请参考以下文章
这是我在visual studio 2010 里写的C++文件,编译错误如下,急求大神解答啊
为啥我的visual stdio 2010连错误程序也能编译成功。。。。
无法在 Visual Basic 2010 中编译,出现错误