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 回答