2015-05-06 80 views
2

例如,我有一個函數模板:參數可以在C++中的函數模板中轉換嗎?

template<typename T> void foo(T a, T b, T &c);

如果我通過int, double, double什麼變化?在Xcode中,它報告了一個錯誤。那麼這是否意味着我無法爲一個模板類型傳遞不同類型的參數?

在另一種情況下,如果我撥打foo<double>(double, int, int),這是一個錯誤。但foo<int>(double, int, int)會沒事的。這個問題是否與參考類型有關?

回答

3

如果不顯式指定類型,則不能傳遞不同的類型。模板是強類型的,如果類型不匹配,類型推導將失敗。

在第一個例子要指定模板類型,並因此與double

foo<double>(T, T, T&) 

顯式實例化模板因此函數作爲參數(double, double, double&)。該示例不起作用,因爲編譯器不爲執行基本類型引用的類型轉換(即,有int n; double& c = n;或其他方法是非法的),並且您傳遞的作爲最後一個參數的int不能綁定到double&參考。

第二個例子

foo<int>(T, T, T&) 

是OK,你明確指定的類型和實例化參數(int, int, int&)功能。現在編譯器爲第一個參數執行所需的轉換(doubleint);沒有爲參考執行轉換。

0

不,當然,T不能同時是intdouble。函數參數與您的調用參數不匹配。

0

如果你在你的模板功能需要不同的參數類型使用此作爲一個例子

template<typename A, typename B, typename C> 
void add(A a, B b, C& c) { 
    c = static_cast<C>(a + b); 
} 

如果你與那些對象的指針,那麼你可能需要改用dynamic_cast的模板類型的工作。

相關問題