2012-09-08 33 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相關問題。