专门化函数模板的语法

时间:2010-04-30 20:22:37

标签: c++ templates swap

以下方法之间有区别吗?

// 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>不起作用,但出于完全不同的原因时,我弄乱了这一点:)

2 个答案:

答案 0 :(得分: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>之类的空格以避免此问题。

答案 1 :(得分:0)

此外,您不需要专注于这种情况,只需过载并感到高兴。

namespace std
{
    void swap(Foo& x, Foo& y)
    {
        x.swap(y);
    }
}