6

Aşağıdaki kod derlenmiyor ve nedenini anlayamıyorum.Boyutu kullanma ... içinde std :: enable_if

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

üretilen hata iletisi: Bu derleyici tarafından doğru olarak ayrıştırılması için

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

cevap

11

Sen parantez gerekir:

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

Bir verebilir açıklama, lütfen? – Incubbus

+0

@Incubbus Gerekçem açıklarım ve cevabımda akıllı bir çözüm sunarım –

9

derleyici doğru açılı ayraç yorumladığı (>) std::enable_if için bir kapatma dirseği olarak. Bu, bir şablon parametresi (veya argüman) listesine başladığınızda, ilk kez derleyicinin, onu kapatma şansına sahip olduğu (> ile) olduğu için olur.

Çözüm (yani yukarıdaki kanıtlıyor): parametre listesini kapatmak durumunu tersine çevirmek ve bir sol açılı ayraç kullanmayın:

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

Demo

İlgili konular