13

g ++ (sürüm 4.8.1_1, Macports) ve clang ++ (sürüm 3.3, Macports) için bazı TMP-ağır kodları yazıyorum. G ++, UNBRIDLED FURY ile aşağıdaki kod listesini reddederken, clang ++ zarafet ve ihtişamı ile derler.g ++ Kısmi Şablon Uzmanlığı ile İlgili Hata

  • Hangi suçlayıcı doğru konumda? (Ben g ++ olduğunu şüpheliyim, ama bir hata raporu göndermeden önce başkalarından biraz güvence almak istiyorum.)
  • Önermek için kolay veya şık bir çözümünüz var mı? ,

İşte kod listesidir (ı., Kod kabul etmek ++ g neden olan bir seçenek değildir ki, bu yüzden yapılar üzerinden geçiş, şablon adlar kullanmak gerekir) sadece sizin için yaptı. Yardımlarınız için

Teşekkür: s çıkışı: Burada

template <class... Ts> 
struct sequence; 

template <int T> 
struct integer; 

// This definition of `extents` causes g++ to issue a compile-time error. 
template <int... Ts> 
using extents = sequence<integer<Ts>...>; 

// However, this definition works without any problems. 
// template <int... Ts> 
// struct extents; 

template <int A, int B, class Current> 
struct foo; 

template <int A, int B, int... Ts> 
struct foo<A, B, extents<Ts...>> 
{ 
    using type = int; 
}; 

template <int B, int... Ts> 
struct foo<B, B, extents<Ts...>> 
{ 
    using type = int; 
}; 

int main() 
{ 
    using t = foo<1, 1, extents<>>::type; 
    return 0; 
} 

gr ++ '

İşte
er.cpp: In function 'int main()': 
er.cpp:39:41: error: ambiguous class template instantiation for 'struct foo<1, 1, sequence<> >' 
    using t = typename foo<1, 1, extents<>>::type; 
             ^
er.cpp:26:8: error: candidates are: struct foo<A, B, sequence<integer<Ts>...> > 
struct foo<A, B, extents<Ts...>> 
     ^
er.cpp:32:8: error:     struct foo<B, B, sequence<integer<Ts>...> > 
struct foo<B, B, extents<Ts...>> 
     ^
er.cpp:39:43: error: 'type' in 'struct foo<1, 1, sequence<> >' does not name a type 
    using t = typename foo<1, 1, extents<>>::type; 
             ^

clang ++ olduğunu ın çıkış' olduğunu!

+4

'+ 1' tek başına şakalar için :) Clang'ın burada olduğuna da bahse girerim. –

+0

"Ana" içinde "typename", gereksizdir –

+0

@ DavidRodríguez-dribeas Teşekkürler, bu alışkanlık haline geldi ... –

cevap