, 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.
'Aslında bunu yanlış olduğunu düşünüyorum o needed' değilken typename disambiguator kullanmak için bir hatadır. –
@Jesse Ben 03 C++ bir hata oldu, ama C++ 11 olmak durdu inanıyoruz. –
@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