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 に答える