5

このようなメンバー関数テンプレートの特殊化を作成したいクラスを書いています

namespace aha
{
class Foo
{
public:
    template < typename T >
    T To() const
    {
        // some code here
    }
};
template <>
bool Foo::To < bool > () const
{
    // some other code here
}
}

gccはエラーを出します:

インスタンス化後の「To<bool>」の明示的なインスタンス化

私のライブラリのユーザーが次のFooような異なるデータ型に変換しながら同じ関数を取得できるように、メンバー関数のテンプレート特殊化のみでそれを実行したいと思います。

Foo obj;
bool b( obj.To < std::string > () );
int i( obj.To < int > () );
float f( obj.To < float > () );

等々。

コードで何が間違っているのか教えてください。

4

1 に答える 1

1

インスタンス化後の「To<bool>」の明示的なインスタンス化

上記はすべてを言います:それはそれの一般的なバージョンがすでに使用された後に専門化されます。

関数テンプレートの特殊化は、より柔軟なメカニズムであるオーバーロードを使用してシミュレートできます(たとえば、関数テンプレートの部分的な特殊化はありませんが、オーバーロードを使用して目的の効果を実現できます)。

template<class T> struct Type {}; // similar to boost::type<>

class Foo
{
    template<class T>
    T doTo(Type<T>) const; // the generic version

    bool doTo(Type<bool>) const; // an overload for bool only
    // add more overloads as you please

public:
    template < typename T >
    T To() const {
        return this->doTo(Type<T>());
    }
};
于 2012-11-21T15:57:25.803 に答える