我知道sizeof...(Args...)
產生的C++ 0x被壓縮的模板參數列表中的類型數量,但我想實現它用於演示目的的其他功能,但它不會編譯。簡單的可變參數模板函數不能立即
// This is not a solution -- overload ambiguity.
// template <typename... Args> size_t num_args(); // Line 7
// template <>
constexpr size_t num_args()
{
return 0;
}
template <typename H, typename... T>
constexpr size_t num_args() // Line 16
{
return 1 + num_args <T...>(); // *HERE*
}
int main()
{
std :: cout << num_args <int, int, int>();
}
此錯誤在*HERE*
與
No matching function call to ...
... candidate is template<class H, class ... T> size_t num_args()
即它沒有看到其首先定義的基本情況。向前聲明template<typename...T>num_args();
在重載解析中引入了歧義。
x.cpp:30:45: note: candidates are:
x.cpp:7:36: note: size_t num_args() [with Args = {int, float, char}, size_t = long unsigned int]
x.cpp:16:9: note: size_t num_args() [with H = int, T = {float, char}, size_t = long unsigned int]
我使用的是gcc 4.6。我該如何做這項工作?
謝謝。
(未經測試,順便說一下) –
謝謝,但我不明白爲什麼它的問題是「其他函數模板總是至少有一個參數H」 - 想象我的帖子的前兩行不註釋 - 何時遞歸到'num_args()'與空'Args ...'當然應該匹配基本情況?!?!? 「安全printf」示例還能如何工作? –
spraff
@spraff再次:你不*有一個基本情況。不存在函數'num_args',它可能有這樣的基本情況。你有'num_args '但這是一個完全不同的函數:它至少有一個參數,所以一個帶有零參數的函數模板是*不是它的專門化。 –