2012-09-08 30 views
2

我在模板编程初学者,我使用下面的模板函数试图避免重复代码:为什么这个调用重载函数模糊?

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过载?

+2

你作为模板参数传入了什么?我记得MSVS有这个问题,但不是GCC,因为MSVS只实现了一半的选项。你可以看看你有的头,并亲自看看他们在那里提供了什么。 – chris

+0

我将它用于原始整数类型,long,int,short和它们的未签名版本。 –

+0

我看到std :: to_string没有我期望的所有重载,它只有long long或unsigned long long。我想这就是问题......那是正确的@chris? –

回答

2

正如克里斯在问题的评论中指出的那样,问题在于我使用的VS2010并未完全实现C++ 11标准。 std::to_string只实现了long longunsigned long long,long double的过载。有关此事的更多详细信息,请参见this相关问题。