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