Синтаксис для специализированных шаблонов функций - PullRequest
6 голосов
/ 01 мая 2010

Есть ли разница между следующими подходами?

// 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 для моего собственного типа строки, и заметил, что swap<::string> не работает, но по совершенно другой причине:)

Ответы [ 2 ]

8 голосов
/ 01 мая 2010

Да, есть. Но не в этом конкретном примере. Если параметр не выводится, это может иметь значение

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>, чтобы избежать проблемы.

0 голосов
/ 01 мая 2010

Кроме того, вам не нужно специализироваться в этом случае, просто перегружайтесь и будьте счастливы.

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