6

次のコードはコンパイルされず、理由を特定できません。std :: enable_if内でのsizeof ...の使用

template <class T, class... Ts> 
typename std::enable_if<sizeof...(Ts) > 0>::type func() { 
    // nop 
} 

生成されるエラーメッセージは次のとおりです。

error: expected unqualified-id before numeric constant 
typename std::enable_if<sizeof...(Ts) > 0u>::type func() { 
             ^

答えて

11

あなたはこのコンパイラで正しく解析されるためには括弧が必要です。

template <class T, class... Ts> 
typename std::enable_if<(sizeof...(Ts) > 0)>::type func() { 
         ^    ^
    // nop 
} 
+0

あなたが与えることができます説明してください。 – Incubbus

+0

@Incubbus私はその根拠を説明し、私の答えに賢いお尻の解決策を与える –

9

コンパイラが直角ブラケット(>)を解釈しますstd::enable_ifの閉じ括弧になります。これは、テンプレートパラメータ(または引数)リストを開始するとコンパイラが最初に(>で)閉じる可能性があるため、そのようになります。

ソリューション(なお、上記の点を証明している):、パラメータリストを閉じた状態を逆転し、左側のアングルブラケットを使用しないでください:

template <class T, class... Ts> 
typename std::enable_if< 0 < sizeof...(Ts) >::type func() {} 
//      ^compilers are cool with this 

Demo

関連する問題