2009-05-21 3 views
4

MSVC 2008 ne compilera pas ce code:problèmes C++ PFI, erreur MSVC C2039

template <class Derived> 
struct B 
{ 
    typename Derived::type t; 
}; 

struct D : B<D> 
{ 
    typedef int type; 
}; 

void main() 
{ 
    D d; 
} 

L'erreur que je reçois est "erreur C2039: 'type': n'est pas membre de« D". Des idées?

Répondre

5

g ++ donne des messages d'erreur plus utiles:

g++ -c -o /tmp/t.o /tmp/t.cpp
/tmp/t.cpp: In instantiation of ‘B’:
/tmp/t.cpp:8: instantiated from here
/tmp/t.cpp:4: error: invalid use of incomplete type ‘struct D’
/tmp/t.cpp:7: error: forward declaration of ‘struct D’
/tmp/t.cpp:12: error: ‘::main’ must return ‘int’

+0

Merci pour cela, Lothar. On dirait que c'est une chose en C++, et pas une chose de compilateur non conforme alors. –

7

Parce que B nécessite la définition complète du type de D pour se définir.

Qu'est-ce que peut-être vous attend peut être eu comme suit:

template <class Derived> 
struct B 
{ 
    B() { 
    typename Derived::type t; 
    } 
}; 

struct D : B<D> 
{ 
    typedef int type; 
}; 

void main() 
{ 
    D d; 
} 

Cela fonctionne parce que, au moment de l'instanciation de D() (et donc B()), le compilateur a une définition complète du type.

+0

Oh, génial, bien sûr. Merci DannyT! –