【发布时间】: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 long、unsigned long long、long double或unsigned long double来规避它,具体取决于它是std::is_integral还是std::is_signed。 -
@chris 您想详细说明一下答案吗?否则我可以做到。顺便说一句,我发现这个问题已经解释了问题:stackoverflow.com/questions/10664699/…
标签: c++ templates overloading