的问题是,你不转发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