【问题标题】:Why is this call to overloaded function ambiguous?为什么这个对重载函数的调用模棱两可?
【发布时间】:2012-09-08 23:18:01
【问题描述】:

我是模板编程的初学者,我正在使用以下模板函数来避免代码重复:

template <class T>
void foo(T iInteger) {

    // ... same algorithm for all integer types

    std::to_string( static_cast<T>(iInteger) ); // C2668: ambiguous call to overloaded function

    // ... end of algorithm

}

我的foo 函数将仅使用原始整数类型调用。 我天真地认为static_cast 足以告诉编译器使用std::to_string() 的哪个重载,但这似乎还不够,因为我仍然得到C2668: ambiguous call to overloaded function。我错过了什么?是否可以避免为所有原始整数类型重复相同的代码,同时仍然调用适当的std::to_string 重载?

【问题讨论】:

  • 你作为模板参数传入了什么?我记得 MSVS 有这个问题,但 GCC 没有,因为 MSVS 只实现了一半的选项。您可以查看您拥有的标题,并亲自查看他们在那里提供的内容。
  • 我将它用于原始整数类型,如 long、int、short 及其无符号版本。
  • 我看到 std::to_string 没有我期望的所有重载,它只有 long long 或 unsigned long long。我想这就是问题所在......这是正确的@chris 吗?
  • 是的,这就是我遇到的那个。从外观上看,VS11 似乎有int 等版本。不过,我没有检查它们是否都在那里,但我认为它们现在是。我想您可以通过将类型转换为long longunsigned long longlong doubleunsigned long double 来规避它,具体取决于它是std::is_integral 还是std::is_signed
  • @chris 您想详细说明一下答案吗?否则我可以做到。顺便说一句,我发现这个问题已经解释了问题:stackoverflow.com/questions/10664699/…

标签: c++ templates overloading


【解决方案1】:

正如 chris 在 cmets 中指出的那样,问题是我使用的是 VS2010,它没有完全实现 c++11 标准。 std::to_string 仅实现 long longunsigned long longlong double 的重载。有关此事的更多详细信息,请参阅this 相关问题。

【讨论】:

    猜你喜欢
    • 2012-08-06
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多