Re: Inheriting from a const class (as a template parameter)
Am 22.12.2012 21:07, schrieb Krzysztof Czai??ski:
In general, inheriting from a const class is illegal, for example:
struct X {};
struct Z : const X {};
causes a compile error on gcc-4.5:
expected ???{??? before ???const???.
Yes, this is restricted by grammar. If go through it, you find that
/class-name/ needs to be either /identifier/ or /simple-template-id/
(I'm ignoring for the moment /decltype-specifier/ which is new in C++11
and even with its addition it wouldn't support a name with cv-qualifers).
Note that this really is just a grammatical constraints. For example, given
typedef const X Y;
Y is also an identifier, so the following is valid
struct Z : Y {};
even though Y corresponds to const X.
9.1p5 says:
"A typedef-name (7.1.3) that names a class type, or a cv-qualified
version thereof, is also a class-name. If a typedef-name that names a
cv-qualified class type is used where a class-name is required, the
cv-qualifiers are ignored. A typedef-name shall not be used as the
identifier in a class-head."
These rules became relaxed with acceptance of
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#298
However, the following compiles on the same gcc, but fails on a TI
compiler (C6000 CG tool 7.*).
struct X {};
template < class T >
struct Y : T {};
int main()
{
Y< const X> y;
}
I am wondering, which compiler is right about the second example: is
gcc too permissive, or should I file a bug to TI?
The code wasn't required to be valid before acceptance of CWG 298
mentioned above, but now it should be accepted. I suggest to send a
bug report to the TI compiler vendor.
[Note: The above rule for typedef-names automatically extends to
template-parameter names, see 14.1 p3:
"A type-parameter whose identifier does not follow an ellipsis defines
its identifier to be a typedef-name (if declared with class or
typename)[..] in the scope of the template declaration." ]
HTH & Greetings from Bremen,
Daniel Kr??gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]