【问题标题】:How to solve ambiguous function overload due to default constructor in parameter如何解决由于参数中的默认构造函数导致的模棱两可的函数重载
【发布时间】:2009-09-28 20:11:24
【问题描述】:

假设我有这个课程:

class Foo {
public:
   void member(std::string s);
   void member(int64_t &n);
};

现在我想做一些类似的事情

int64_t value = 5;
Foo f;
f.member(value);

问题是编译器(至少是 GCC)感到困惑,并认为我正在尝试使用 char* 构造函数调用带有字符串的成员:

从“int64_t”到“const char*”的无效转换

如何在不更改方法签名的情况下调用我想要的实际成员函数?模板是唯一的解决方案吗?我已经尝试在没有任何帮助的情况下进行投射(这无关紧要,因为类型已经明确)。


抱歉 - 发现错误。

声明是:

class Foo {
public:
    void member(std::string s);
    void member(int64_t &n);
};

删除 by-ref 解决了它。

【问题讨论】:

  • 我无法在 Ubuntu 上使用 GCC 3.3、4.2 或 4.4 或在 Solaris 10 上使用 GCC 3.4 重现该错误。
  • 你是对的 - 出于某种原因,我试图简化为简单案例的尝试失败了。这是我的实际代码的编译器错误 - 也许我错过了其他东西。
  • 现在更改为int64_t& 对我来说不再有意义,为什么它应该无法编译。

标签: c++ gcc g++


【解决方案1】:

将参数强制转换为与您想要的重载的参数类型完全匹配:

f.member((int64_t) value);

【讨论】:

  • 如果您已经传递了一个具有正确类型的变量,那将是多余的。
  • 那行不通,因为他有一个非常量引用参数。
  • @unknown:但他没有传递正确的类型。参数应该是 int64_t 他正在传递 uint64_t
  • 对不起 - 描述中的错字。那应该是 int64_t。
【解决方案2】:

抱歉 - 发现错误。

声明是:

class Foo {
public:
   void member(std::string s);
   void member(int64_t &n);
};

删除 by-ref 解决了它。

【讨论】:

  • 你改变了你说你不想做的方法签名……嗯嗯
  • 是的,我猜。我更多地考虑更改函数名称。我仍然不清楚为什么编译器会感到困惑(仅在我的代码中 - 我尝试将代码简化为示例失败)。
【解决方案3】:

可能有更简单的方法来解决这个问题(比如使用参数转换),但我看到的解决方案如下所示:

void (Foo::*memberProc)(int64_t) = &Foo::member;

Foo f;
((f).*(memberProc))(5);

错综复杂,是的,但它很明确。

【讨论】:

  • 丑陋的。我宁愿割腕也不愿使用这种解决方案。
猜你喜欢
  • 1970-01-01
  • 2017-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多