2012-10-12 24 views
6
ben aşağıdaki kod bit derlemek çalışıyorum

, ancak çözmek gibi olamaz bir sorun var gibi görünüyor:C++ ve CRTP desen uygulama ve derleyici ikilem

template <int x> 
struct count_x 
{ 
    enum { x_size = x }; 
}; 

template <typename y> 
struct crtp_base 
{ 
    typedef typename y::count_t count_t; 
    crtp_base(const count_t&){} 
}; 

template <int x> 
struct derived : public crtp_base<derived<x> > 
{ 
    typedef typename count_x<x> count_t; 
    typedef crtp_base<derived<x> > base_t; 
    derived(const count_t& c) : base_t(c){} 
}; 


int main() 
{ 
    derived<2> d((count_x<2>())); 
    return 0; 
} 

clang wth derlenmiş zaman 3.1 aşağıdaki hatadır:

c:\clangllvm\code\example.cc:18:21: error: expected a qualified name after 'typename' 
    typedef typename count_x<x> count_t; 
        ^
c:\clangllvm\code\example.cc:18:21: error: typedef name must be an identifier 
    typedef typename count_x<x> count_t; 
        ^~~~~~~~~~ 
c:\clangllvm\code\example.cc:18:28: error: expected ';' at end of declaration list 
    typedef typename count_x<x> count_t; 
         ^
          ; 
c:\clangllvm\code\example.cc:20:18: error: no template named 'count_t'; did you mean 'count_x'? 
    derived(const count_t& c) 
       ^~~~~~~ 
       count_x 
c:\clangllvm\code\example.cc:2:8: note: 'count_x' declared here 
struct count_x 
    ^
c:\clangllvm\code\example.cc:20:18: error: use of class template count_x requires template arguments 
    derived(const count_t& c) 
       ^
c:\clangllvm\code\example.cc:2:8: note: template is declared here 
struct count_x 
    ^
5 errors generated. 

Ben şablonları derleme zamanında belirlenir şekilde bir ilgisi var inanmak ve doğru zamanda bir tür olarak belirlenmiştir eğer. Ayrıca "base_t :: count_t; kullanarak boşuna" eklemeye çalıştım. Bunun dışında derleyici tarafından üretilen tanılama beni gerçekten kaybetti. Bu hata hakkında okunacak bir şey hakkında bir cevap veya öneri takdir edilecektir.

cevap

2

count_x<x>, nitelikli bir ad değildir (:: numaralı sayfaya sahip değildir!), Dolayısıyla typename ile önceden eşlenemez. Bunu düzeltmek kez CRTP tabanını başlatır zaman türetilmiş türün iç içe typedefs henüz derleyici tarafından görülmedi çünkü

, kod hala başarısız olur. Bu other question bazı alternatifler gösterir.

+0

'Aslında bunu yanlış olduğunu düşünüyorum o needed' değilken typename disambiguator kullanmak için bir hatadır. –

+0

@Jesse Ben 03 C++ bir hata oldu, ama C++ 11 olmak durdu inanıyoruz. –

+0

@Martinho: Bu değişikliği yaptım, şimdi başka bir hata seti veriyor: c: \ clangllvm \ code \ example.cc: 10: 24: hata: 'türetilmiş <2>' türetilmiş 'count_t' adında bir tür yok typedef typename y: : count_t count_t; ~~~~~~~~~~~~^~~~~~~ c: \ clangllvm \ kodu \ example.cc: 15: 25: not: şablon sınıfı örnekleme içinde 'crtp_base >' Burada istenen türetilmiş yapı: Genel crtp_base > ^ c: \ clangllvm \ kodu \ example.cc: 25: 15: Not: şablonu sınıfının örnekleme burada talep edilen '<2> türetilmiş' <2> d ((count_x <2>())); – Switzy