Tôi đang cố sử dụng dạng CRTP đơn giản (Mẫu tò mò định kỳ) vì tôi có nhiều lớp, mỗi lớp có một số lớp liên quan và tôi muốn có phương thức ràng buộc chúng cùng nhau (ví dụ như tôi đã có các lớp như Widget, Doobry và Whatsit, với các lớp có liên quan WidgetHandle, DoobryHandle và WhatsitHandle).Lỗi biên dịch cho trường hợp CRTP đơn giản với các kiểu phụ thuộc
Mỗi lớp mà tôi đang sử dụng để kế thừa từ Base
thêm một typaief value_type
để lớp cơ sở có thể tham chiếu đến nó là typename TWrapper::value_type
.
struct WidgetHandle {};
template <typename TWrapper>
class Base
{
public:
Base(typename TWrapper::value_type value_)
: value(value_) {}
typename TWrapper::value_type value;
};
class Widget : public Base<Widget>
{
public:
typedef WidgetHandle value_type;
Widget(WidgetHandle value_) : Base<Widget>(value_) {}
};
int main(int argc, char* argv[])
{
Widget i(WidgetHandle());
return 0;
}
Tuy nhiên, tôi nhận được lỗi biên dịch:
scratch1.cpp(10): error C2039: 'value_type' : is not a member of 'Widget'
scratch1.cpp(16) : see declaration of 'Widget'
scratch1.cpp : see reference to class template instantiation 'Base<TWrapper>' being compiled
1> with
1> [
1> TWrapper=Widget
1> ]
scratch1.cpp(10): error C2039: 'value_type' : is not a member of 'Widget'
Đây là với VS2010, mặc dù tôi nhận được lỗi tương tự với kêu vang. Tôi đang thiếu gì ở đây?
'Widget' là loại không đầy đủ khi bạn chuyển nó làm tham số cho' Cơ sở'. – jrok
Tôi không thấy 'giá trị_type' được xác định ở bất kỳ đâu, trên thực tế. – lapk
@PetrBudnik Đó là, lúc bắt đầu của 'Widget' cơ thể. – jrok