g++ rejects legal?
Richard Guenther
rguenth@tat.physik.uni-tuebingen.de
Thu Nov 4 13:42:00 GMT 2004
On Thu, 4 Nov 2004, Richard Guenther wrote:
> Hi!
>
> There must be some weird C++ rules again. Consider:
Simpler testcase:
template <class E, class C>
struct CompFwd;
struct Brick;
template <int Dim, class T, class EngineTag>
struct Engine;
template <int Dim, class T, class E>
class Array;
template <class Subject>
struct ComponentView;
template<int Dim, class T, class EngineTag>
struct ComponentView<Array<Dim, T, EngineTag> >
{
typedef Array<Dim, T, EngineTag> Subject_t;
typedef typename Subject_t::Engine_t Engine_t;
typedef Array<Dim, T, CompFwd<Engine_t, int> > Type_t;
};
template <int Dim, class T, class EngineTag>
struct Array
{
typedef Engine<Dim, T, EngineTag> Engine_t;
typedef Array<Dim, T, EngineTag> This_t;
typename ComponentView<This_t>::Type_t
comp(int i1) const;
};
typedef Array<1, double, Brick> Array_t;
//typedef Array_t::Engine_t Dummy1_t;
//typedef Engine<1, double, Brick> Dummy2_t;
typedef ComponentView<Array_t>::Type_t CView_t;
tests> g++-3.4 -c notype.cpp
notype.cpp: In instantiation of `Array<1, double, Brick>':
notype.cpp:19: instantiated from `ComponentView<Array_t>'
notype.cpp:36: instantiated from here
notype.cpp:30: error: no type named `Type_t' in `struct
ComponentView<Array_t>'
uncommenting the Dummy1_t typedef fixes the testcase, uncommenting the
Dummy2_t one not.
Richard.
More information about the Gcc
mailing list