"Ambiguous call to overloaded function"

"Ambiguous call to overloaded function"

本文关键字:function overloaded call Ambiguous to      更新时间:2023-10-16

我有一个这样的结构,结构Baz继承了两个不同的结构,Foo和Bar。

我有两个方法调用相同的东西,一个是Foo参数,另一个是Baz参数。

struct Foo
{
};
struct Bar
{
};
struct Baz : Foo, Bar
{
    virtual void something(const Foo& foo)
    {
    };
    virtual void something(const Bar& bar)
    {
    };
};

我把它叫做

Baz baz;
baz.something(baz);

可以理解的是,如果我将Baz的一个实例传递给代码,那么我的代码就不知道我在调用哪个函数。我得到了"对重载函数的模糊调用"。

我知道我可以把我的巴兹交给Foo或Bar来解决这个问题。。。

Baz baz;
baz.something((Bar)baz);

但是有没有其他的方法来处理这个设计问题呢?

只有当传递的对象不是Bar类型时,我才想调用Foo方法。

编辑:

如果这是C#(事实并非如此),我可能可以使用模板where子句来解决这个问题

首先,请注意,您使用的强制转换将创建一个临时对象。你可能是这个意思:

baz.something(static_cast<Bar&>(baz));

为了回答你的问题,应该可以使用SFINAE:

struct Baz : Foo, Bar
{
  virtual void something(const Bar &bar)
  { /* ... */ }
  template <
    class T,
    class = typename std::enable_if<
      std::is_convertible<const T&, const Foo&>::value &&
      !std::is_convertible<const T&, const Bar&>::value
    >::type
  >
  void something (const T &foo)
  { something_impl(static_cast<const Foo&>(foo)); }
private:
  virtual void something_impl(const Foo &foo)
  { /* ... */ }
};

实时示例

相关文章: