下面的代碼工作爲:目標,左聯和操作:sum(1,2,3,4);
可變參數模板和操作左關聯
但是,它不會正確的sum(1,2,3,4,5)
或sum(1,2,3,4,5,...)
工作。任何超過4個參數給出了錯誤:
error: no matching function for call to sum(int, int, int, int, int)
=================================
template <typename T>
T sum(const T& v) {
return v;
}
template <typename T1, typename T2>
auto sum(const T1& v1, const T2& v2) -> decltype(v1 + v2) {
return v1 + v2;
}
template <typename T1, typename T2, typename... Ts>
auto sum(const T1& v1, const T2& v2, const Ts&... rest) -> decltype(v1 + v2 + sum(rest...)) {
return v1 + v2 + sum(rest...);
}
int main() {
cout << sum(1,2,3,4); //works correctly
//cout << sum(1,2,3,4,5); //compile error
}
我的猜測是,它可以不使用recursivly之前,decleared那些varidic模板evauluate的總和。我不知道如何解決它。不可能? – Xale
我可以在gcc 4.7.2上重現該問題:http://ideone.com/6X4f2b - 似乎gcc拒絕以遞歸方式使用auto/decltype返回類型調用可變參數模板。 –
看到這個[鏈接] [1]。接近相同的問題。 [1]:http://stackoverflow.com/questions/3744400/trailing-return-type-using-decltype-with-a-variadic-template-function – Xale