Explicity template specialization issue
Jonathan Wakely
jwakely.gcc@gmail.com
Wed Sep 21 08:15:00 GMT 2011
On 21 September 2011 06:22, himanshu.gupta wrote:
>
> Hi,
>
> The following code is giving errors while compiling with GCC 4.5.
>
> Header File: declaration of template class.
>
> namespace public
'public' is not a valid namespace name.
> {
>
> template<class T>
> class Z
> {
> }; //Z
>
> template<class ABC>
> class X
> {
> protected:
> template<class T>
> class Y: public Z<T>
> {
> void MyFunc( X<ABC>& base )
> {
> do somthing...;
This isn't valid C++ either, it helps if you post real example code
that is what you're actually trying to compile e.g.
// do something
> }
> }; //Y
>
> // Explicit specialization for "void" class.
> template<>
> class Y<void>: public Z<void>
> {
> void MyFunc( X<ABC>& base )
> {
> do somthing else...;
> }
> }; //Y explicit specialization
>
> template<typename T> friend class Y;
> }; //X
>
> } // public
>
> The above explicit inner class declaration for "void" is giving errors...
> Errors for the line after the code comment of Explicity specialization):
> error: explicit specialization in non-namespace scope 'class public::X<ABC>'
This is telling you that you can't declare the specialization there,
it must be at namespace-scope not at class-scope.
If you move it to class scope you will get a different error because
(as you say below) you cannot specialize an inner template without
specializing the outer class template.
> Note that the C++ standard says you cannot specialise the inner template
> without specialising the outer template. But I can not declare/define inner
> template class Y outside as it is using the outer template class parameter
> for the function.
Yes you can:
template<>
template<>
class X<int>::Y<void>: public Z<void>
{
void MyFunc( X<int>& base )
{
}
}; //Y explicit specialization
More information about the Gcc-help
mailing list