Are homonymous non-template and template classes incompatible?
It is common practice to implement an abstract interface by several
concrete parametrized classes, like in the example below:
struct abstract // Interface
{
virtual void do_it()=0;
virtual ~abstract() {}
};
template<typename T> struct concrete: abstract // Implementation
{
void do_it() {}
};
When a concrete object is instanciated with T=int, the following
mangling is generated by the compiler:
00000000 V typeinfo for abstract [mangled into: _ZTI8abstract]
00000000 V typeinfo for concrete<int> [mangled into: _ZTI8concreteIiE]
For sure, this mangling is compiler-dependent; however, it is remarkable
that, if we had chosen different names for our classes, the mangling
would always differ.
Consequently, I would like to give to "abstract" and to "concrete" the
same name, say "my_class", as illustrated in the code "template.cpp" (12
lines) listed below:
struct my_class // Interface
{
virtual void do_it()=0;
virtual ~my_class() {}
};
template<typename T> struct my_class: my_class // Implementation
{
void do_it() {}
};
my_class<int> my_obj; // Object instanciation
G++ is definitely confused by this code:
g++ -c template.cpp -o /dev/null
template.cpp:7: error: `my_class' is not a template type
template.cpp:8: error: recursive type `my_class' undefined
template.cpp:8: error: redefinition of `struct my_class'
template.cpp:2: error: previous definition of `struct my_class'
template.cpp:12: error: non-template type `my_class' used as a template
template.cpp:12: error: ISO C++ forbids declaration of `my_obj' with
no type
template.cpp:11: confused by earlier errors, bailing out
Is this a limitation of the compiler or of the C++ language? My opinion
is that if the compiler parser was able to cope with the syntax, then
the generated code would be supported by any linker because of the
different mangling of non-template and template homonymous classes.
Thanks,
Sylvain GUILLEY.
--
Sylvain GUILLEY, ENST / COMELEC, F305, 46 rue Barrault 75634 Paris
Cedex 13
Tel. : 01 45 81 83 33 | Fax : 01 45 80 40 36 | Mel :
sylvain.guilley@enst.fr
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]