Проблема заключается в том, что вы не пересылает 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)...));
}
Теперь проблема заключается в том, что все аргументы, переданные в должны иметь такую же категорию стоимость и любой Lvalue аргумент вызовет ошибку, например, 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: примечание: сбой аргумента шаблона/замещения: test.cpp: 12: 49: note: выведенные конфликтующие типы для параметра 'T' ('int &' и 'int') return f (a, f (b, std: forward (args) ...)); –
robal
std :: forward определяется в не –
robal