Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GCC error: explicit specialization in non-namespace scope

Tags:

c++

gcc

templates

I am trying to port the following code. I know the standard doesn't allow explicit specialization in non-namescape scope and I should use overloading, but I just can't find a way to apply this technique in this particular case.

class VarData
{
public:
    template < typename T > bool IsTypeOf (int index) const
    {
        return IsTypeOf_f<T>::IsTypeOf(this, index); // no error...
    }

    template <> bool IsTypeOf < int > (int index) const // error: explicit specialization in non-namespace scope 'class StateData'
    {
        return false;
    }

    template <> bool IsTypeOf < double > (int index) const // error: explicit specialization in non-namespace scope 'class StateData'
    {
        return false;
    }
};
like image 700
Ryan Avatar asked Apr 25 '11 09:04

Ryan


2 Answers

You just have to move your specializations of the member templates outside of the class body.

class VarData { public:     template < typename T > bool IsTypeOf (int index) const     {         return IsTypeOf_f<T>::IsTypeOf(this, index);     } };  template <> bool VarData::IsTypeOf < int > (int index) const {     return false; }  template <> bool VarData::IsTypeOf < double > (int index) const {     return false; } 
like image 104
CB Bailey Avatar answered Oct 05 '22 00:10

CB Bailey


Define the specialization outside the class as:

template <> 
bool VarData::IsTypeOf < int > (int index) const 
{  //^^^^^^^^^ don't forget this! 
     return false;
}

template <> 
bool VarData::IsTypeOf < double > (int index) const 
{   //^^^^^^^ don't forget this!
     return false;
}
like image 30
Nawaz Avatar answered Oct 05 '22 02:10

Nawaz