2012-10-12 30 views
6

Tôi đang cố gắng để biên dịch các bit mã sau biên dịch, tuy nhiên có vẻ là một vấn đề mà tôi dường như không thể giải quyết:C++ và CRTP thực hiện mô hình và tiến thoái lưỡng nan

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; 
} 

Khi biên soạn wth kêu vang 3.1, sau đây là lỗi:

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. 

Tôi tin rằng nó có liên quan đến cách xác định mẫu lúc biên dịch và nếu chúng được xác định là loại vào đúng thời điểm. Tôi cũng đã thử thêm "using base_t :: count_t;" để không có kết quả. Khác hơn thế, chẩn đoán được tạo ra bởi trình biên dịch đã khiến tôi thực sự bị mất. Một câu trả lời hoặc một gợi ý về một cái gì đó để đọc về lỗi này sẽ được đánh giá cao.

Trả lời

2

count_x<x> không phải là tên đủ điều kiện (số này không có ::!), Vì vậy không thể đặt trước là typename.

Khi bạn khắc phục điều này, mã sẽ vẫn không thành công do kiểu gõ có kiểu gốc của trình biên dịch chưa được trình biên dịch nhìn thấy khi nó khởi tạo cơ sở CRTP. Điều này other question cho thấy một số lựa chọn thay thế.

+0

'Đó là lỗi khi sử dụng trình đánh dấu tên tệp khi nó không cần thiết' thực sự tôi nghĩ đó là sai. –

+0

@ Jesse Tôi tin rằng đó là một lỗi trong C++ 03, nhưng dừng lại ở C++ 11. –

+0

@Martinho: Tôi đã thực hiện thay đổi đó, hiện tại nó đưa ra một bộ lỗi khác: c: \ clangllvm \ code \ example.cc: 10: 24: lỗi: không có loại 'count_t' trong 'bắt nguồn <2>' typedef typename y: : count_t count_t; ~~~~~~~~~~~~^~~~~~~ c: \ clangllvm \ code \ example.cc: 15: 25: lưu ý: trong instantiation của lớp mẫu 'crtp_base >' yêu cầu ở đây struct có nguồn gốc: crtp_base công > ^ c: \ clangllvm \ đang \ example.cc: 25: 15: lưu ý: trong instantiation của lớp mẫu 'có nguồn gốc <2>' yêu cầu ở đây có nguồn gốc <2> d ((count_x <2>())); – Switzy

Các vấn đề liên quan