我很惊讶以下代码在VS2005中没有任何投诉而编译,因为在实现中调用Bar()让我停下来并想知道如何消除歧义。
class Foo
{
public:
void Bar(int param = 0);
private:
void Bar();
};
其中:
void Foo::Bar(int param)
{
// do something
return Bar();
}
任何人都可以启发我吗?
编辑:
D'哦!
立即意识到我的理解中的差距......
我的实际标题是
class Foo : public IFoo
{
public:
void Bar(int param);
private:
void Bar();
};
class IFoo
{
public:
virtual void Bar(int param = 0) = 0;
};
与我最初发布的内容不同。我以为是。
答案 0 :(得分:0)
首先,因为你有'void Foo :: Bar(int paaram)you do not need the
return`的方法签名。
同样使用默认参数,您可以使用或与我们的参与者一起调用它。
因此,调用bar()
编译器可以调用(1)或(2),因为它们都同样有效。那么编译器要做什么?它所能做的只是发出一个错误。
class Foo
{
public:
void Bar(int param = 0); (1)
private:
void Bar(); (2)
};
void Foo::Bar(int param) (3)
{
// do something
Bar();
}
答案 1 :(得分:0)
当您调用不明确的函数时,错误会阻止编译。例如:
#include <iostream>
using namespace std;
void f(int, int = 2)
{
cout<< "first f" << endl;
}
void f(int)
{
cout<< "second f" << endl;
}
int main()
{
f(2); // removing this live will let the error go
}
答案 2 :(得分:0)
要消除歧义,重命名Bar()
或将其移动到类似的基类:
class Base
{
protected:
void Bar() { }
};
class Foo : public Base
{
public:
void Bar(int param = 0)
{
// do something
return Base::Bar();
}
};