重载方法采用可选和无参数:为什么没有歧义?

时间:2013-08-03 09:45:25

标签: c++ overloading

我很惊讶以下代码在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;
};

与我最初发布的内容不同。我以为是。

3 个答案:

答案 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();
    }
};