Sto provando a utilizzare una forma semplice di CRTP (Pattern modello ricorrente in modo curioso) poiché ho diverse classi, ognuna con diverse classi correlate e voglio un mezzo di associazione insieme (ad es. ho classi come Widget, Doobry e Whatsit, con classi correlate WidgetHandle, DoobryHandle e WhatsitHandle).Errori di compilazione per un caso CRTP semplice con tipi dipendenti
Ogni classe che utilizzo per ereditare da Base
aggiunge un typedef value_type
in modo che la classe base possa riferirsi ad esso come 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;
}
Comunque, sto ricevendo errori di compilazione:
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'
Questo è con VS2010, se sto ricevendo errori simili con clangore. Cosa mi manca qui?
'Widget' è un tipo incompleto quando lo si passa come parametro a' Base'. – jrok
Non vedo 'value_type' definito da nessuna parte, in effetti. – lapk
@PetrBudnik È, all'inizio del corpo di 'Widget'. – jrok