0

次のようにテンプレートクラスを作成しようとしたとき:

template <typename TList>
class Variant
{
public :
    std::string toString(); // var.toString()

    template<typename T>
    std::string toString(); // var.toStrint<int>();

    protected:
    template <typename T>
    std::string toString(T v); // internal Specialization

    template <>
    std::string toString(int v); // internal Specialization

    template <typename T>
    const T & get() 
    {
        std::size_t  type_index = TypeListNamespace::IndexOf<TList, T>::value ;

        if ( type_index == max_num_of_t  || type_index != _type_index)
            throw std::bad_cast() ;  

        void * ptr = (void*) &_variant_holder;
        T * vptr = reinterpret_cast<T *>(ptr);
        return *vptr; 
    }
};

// CPP FILE:

template <typename TList>
std::string Variant<TList>::toString ()
{
    // var.toString()
}

template<typename TList>
template<typename T>
std::string Variant<TList>::toString ()
{               
    return toString( get<T>() );  
}

template<typename TList>
template<typename T>
std::string Variant<TList>::toString (T v)
{                
    // no default toString method.
    return "";
}

template<typename TList>
template<>       
std::string Variant<TList>::toString (int v)
{                
    // Specialized toString for int values:
    return Core::Utility::formatString("%i", v );
}

.. other specializations ..

次のエラーが発生しました。

error C2244: 'Core::Variant<TList>::toString': unable to match function definition to an existing declaration
2>          Definition
2>          'std::string Core::Variant<TList>::toString(int)'
2>          Available Deklarations
2>          'std::string Core::Variant<TList>::toString(T)'
2>          'std::string Core::Variant<TList>::toString(void)'
2>          'std::string Core::Variant<TList>::toString(void)'

クラス定義内にこれらの特殊化があると、すべてがすぐにコンパイルされました。したがって、テンプレートの構文に何か問題があったと思います。しかし、特殊化されたクラス テンプレートと関数テンプレートが混在する例を見つけるのは困難です。だから、私にとって良いヒントを持っている人を期待してここにたどり着きました。

4

2 に答える 2

0

専門分野の上に「テンプレート<>」を置く必要はないようです。

それらを削除すると、すべてが正常にコンパイルされます(自宅でこれを試さないでください)

template <typename TList>
class Variant
{
public :
    std::string toString(); // var.toString()

    template<typename T>
    std::string toString(); // var.toStrint<int>();

    protected:
    template <typename T>
    std::string toString(T v); // internal Specialization

    // DON'T TRY THIS AT HOME: template <>
    std::string toString(int v); // internal Specialization

    template <typename T>
    const T & get() 
    {
        std::size_t  type_index = TypeListNamespace::IndexOf<TList, T>::value ;

        if ( type_index == max_num_of_t  || type_index != _type_index)
            throw std::bad_cast() ;  

        void * ptr = (void*) &_variant_holder;
        T * vptr = reinterpret_cast<T *>(ptr);
        return *vptr; 
    }
};

// CPP FILE:

template <typename TList>
std::string Variant<TList>::toString ()
{
    // var.toString()
}

template<typename TList>
template<typename T>
std::string Variant<TList>::toString ()
{               
    return toString( get<T>() );  
}

template<typename TList>
template<typename T>
std::string Variant<TList>::toString (T v)
{                
    // no default toString method.
    return "";
}

template<typename TList>
// DON'T TRY THIS AT HOME: template<>       
std::string Variant<TList>::toString (int v)
{                
    // Specialized toString for int values:
    return Core::Utility::formatString("%i", v );
}

.. other specializations ..
于 2012-12-10T15:41:12.150 に答える