的問題是,你不轉發a
或b
當遞歸調用f
,從而導致在試圖撥打二進制超載與a : int
和b : int&
。這裏有一個第一步:
template<typename T>
T f(T&& a, T&& b) {
return a + b;
}
template<typename T, typename... Args>
T f(T&& a, T&& b, Args&&... args) {
return f(std::forward<T>(a), f(std::forward<T>(b), std::forward<Args>(args)...));
}
現在的問題是,傳遞必須具有相同的價值範疇任何左值參數的所有參數會導致錯誤,例如int i = 2; f(1, i, 3);
將會失敗。爲了解決這個問題..:
template<typename T, typename U>
typename std::decay<T>::type
f(T&& a, U&& b) {
return a + b;
}
template<typename T, typename U, typename... Args>
typename std::decay<T>::type
f(T&& a, U&& b, Args&&... args) {
return f(std::forward<T>(a), f(std::forward<U>(b), std::forward<Args>(args)...));
}
然後可以簡化爲:
template<typename T, typename U>
typename std::decay<T>::type
f(T&& a, U&& b) {
return a + b;
}
template<typename T, typename... Args>
typename std::decay<T>::type
f(T&& a, Args&&... args) {
return f(std::forward<T>(a), f(std::forward<Args>(args)...));
}
哪個調用'F'你有問題嗎?您顯示的代碼中有三個。 –
作爲提示g ++ 4.9.3給出以下錯誤: test.cpp:10:3:note:template argument deduction/substitution failed: test.cpp:12:49:note:推導出的參數'T'的衝突類型( 'int&'和'int') return f(a,f(b,std :: forward(args)...)); –
robal
std :: forward定義在不是 –
robal