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.
'Đó 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. –
@ Jesse Tôi tin rằng đó là một lỗi trong C++ 03, nhưng dừng lại ở C++ 11. –
@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