6

次のアプローチに違いはありますか?

// approach 1
namespace std
{
    template<>
    void swap<Foo>(Foo& x, Foo& y)   // note the <Foo>
    {
        x.swap(y);
    }
}

// approach 2
namespace std
{
    template<>
    void swap(Foo& x, Foo& y)
    {
        x.swap(y);
    }
}

自分の文字列型のスワップを特化しようとしたときにこれに出くわし、それswap<::string>が機能しないことに気付きましたが、まったく別の理由で:)

4

2 に答える 2

8

はいあります。しかし、その特定の例ではありません。パラメータが推定されない場合、違いが生じる可能性があります

template<typename T> void f(typename T::type t);

パラメータリストから<type>何を推測することができないので、それなしでそれを専門化することはできません。T

struct MyType { typedef int type; };

// needs <MyType>
template<> void f<MyType>(int t) { }

もちろん、あなたの場合、問題を引き起こす<:のと同じ意味の有向グラフです。問題を回避するためにの[ようなスペースを入れてください。< ::string>

于 2010-04-30T20:28:53.720 に答える
0

さらに、この場合に特化する必要はありません。オーバーロードして幸せになるだけです。

namespace std
{
    void swap(Foo& x, Foo& y)
    {
        x.swap(y);
    }
}
于 2010-04-30T20:51:50.540 に答える