专门化函数模板的语法

fre*_*low 6 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试专门交换我自己的字符串类型并注意到它swap<::string>不起作用时,我很困惑,但是出于完全不同的原因:)

Joh*_*itb 8

就在这里.但不是在那个特定的例子中.如果没有推导出参数,它可以产生影响

template<typename T> void f(typename T::type t);
Run Code Online (Sandbox Code Playgroud)

你不能专注于<type>它,因为它无法推断出T参数列表中的内容.

struct MyType { typedef int type; };

// needs <MyType>
template<> void f<MyType>(int t) { }
Run Code Online (Sandbox Code Playgroud)

当然,在你的情况下,它是有向图<:的意思与[导致你的问题相同.放一个空间就好< ::string>避免这个问题.