6

Der folgende Code kompiliert nicht, und ich kann einfach nicht herausfinden, warum.Verwenden von sizeof ... in std :: enable_if

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

Die Fehlermeldung erzeugt wird:

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

Antwort

11

Sie Klammern müssen für diese korrekt vom Compiler analysiert werden:

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

Können Sie eine geben Erklärung, bitte? – Incubbus

+0

@Incubbus Ich erkläre die Gründe und gebe eine kluge Lösung in meiner Antwort –

9

Der Compiler interpretiert die rechte spitze Klammer (>) als Schließbügel für std::enable_if. Dies geschieht, weil, sobald Sie eine Vorlage Parameter (oder Argument) Liste beginnen, das erste Mal, der Compiler, hat die Chance, es zu schließen (mit >), tut es dies.

Lösung (das beweist den oben Punkt): Schließen Sie nicht die Parameterliste in umgekehrten Zustand und mit einem linken Winkel:

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

Demo