【问题标题】:Overloaded methods taking optional and no arguments: why no ambiguity?采用可选且无参数的重载方法:为什么没有歧义?
【发布时间】:2013-08-03 09:45:25
【问题描述】:

我很惊讶在 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;
};

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

【问题讨论】:

  • 并且可以手动消除歧义:(this->*static_cast<void(Foo::*)()>(&Foo::Bar))();
  • @jrok 关于您的第二条评论 - 这将如何消除歧义?您仍在使用模棱两可的Foo::Bar...
  • @cluracan static_cast 到相应的成员函数指针就可以了。
  • @jrok:是的,我的错误......太糟糕了,我不能对自己投反对票 =/

标签: c++ overloading


【解决方案1】:

首先,您的方法签名为 'void Foo::Bar(int paaram)you do not need thereturn`。

您也可以使用默认参数调用它,带或不带我们的参数。

因此调用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();
}

【讨论】:

  • 显然不是 all 它可以做到的。 VS 2005(据称)设法编译它。问题是,为什么/如何允许这样做?
  • @cHao 因为它坏了:)
  • @cHao:我的错,发帖后才发现。
【解决方案2】:

当您调用不明确的函数时,错误会阻止编译。例如:

#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    
}

【讨论】:

    【解决方案3】:

    为了消除歧义,要么重命名Bar(),要么将其移至这样的基类:

    class Base
    {
    protected:
        void Bar() { }
    };
    
    class Foo : public Base
    {
    public:
        void Bar(int param = 0)
        {
            // do something
            return Base::Bar();
        }
    };
    

    【讨论】:

      猜你喜欢
      • 2015-10-28
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多