2015-10-03 17 views
5

このコードは正しい形式ですか? Tsが空であっても、関数テンプレートの宣言はclangとgccの両方でエラーを出します。固定数のテンプレート引数を持つクラス内の複数のパック拡張パック

// error: too many template arguments for class template 'pair' 
template<class I, class U, class... Ts> 
void f(std::pair<I,U,Ts...>); 

int main() 
{ 
    f(std::pair<int,int>()); 
} 

関数呼び出しは意味がありませんgccの中で、このエラーが発生します。 intへの変換はありません。

note: cannot convert 'std::pair<int, int>()' (type 'std::pair<int, int>') to type 'int' 
+0

2つ以上のargを使用する場合は、std :: pairの代わりにstd :: tupleを試してください。 –

答えて

4

[temp.res]/8:

可変長引数テンプレートのすべての有効な分業が空 テンプレートパラメータパックが必要な場合は、テンプレートが悪い形成されています、診断なし が必要です。

fのすべての有効な特殊化では、Tsが空のパックである必要があります。したがって、プログラムは不正な形式のNDRです。どちらのコンパイラも正しいです。

GCCの診断では、エラー回復の目的で、「タイプに見えますが意味をなさないもの」のプレースホルダーとしてintを使用するという習慣のようです。

関連する問題