2

我很惊讶在 VS2005 中编译的以下代码没有任何抱怨,因为在实现中对 Bar() 的调用让我停下来想知道如何消除歧义。

class Foo
{
public:
  void Bar(int param = 0);

private:
  void Bar();
};

在哪里:

void Foo::Bar(int param)
{
  // do something
  return Bar();
}

任何人都可以启发我吗?

编辑:

哦!
顿时意识到自己理解上的差距……

我的实际标题是

class Foo : public IFoo
{
public:
  void Bar(int param);

private:
  void Bar();
};

class IFoo
{
public:
  virtual void Bar(int param = 0) = 0;
};

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

4

3 回答 3

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    
}
于 2013-08-03T09:58:49.843 回答
0

要消除歧义,请重命名Bar()或将其移动到这样的基类:

class Base
{
protected:
    void Bar() { }
};

class Foo : public Base
{
public:
    void Bar(int param = 0)
    {
        // do something
        return Base::Bar();
    }
};
于 2013-08-03T10:03:12.430 回答
0

首先,您有一个“void Foo::Bar(int paaram) return”的方法签名you do not need the

同样使用默认参数,您可以使用或不使用我们的参数来调用它。

因此调用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();
}
于 2013-08-03T09:52:06.470 回答