Синтаксис для специализации шаблонов функций

Существует ли различие между следующими подходами?

// 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);
    }
}

Я stumpled на это, когда я попытался специализировать подкачку для своего собственного строкового типа и заметил это swap<::string> не работает, но по совершенно другой причине :)

6
задан fredoverflow 30 April 2010 в 20:22
поделиться

2 ответа

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

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

Вы не можете специализировать это без <тип>, потому что он не может вывести, что такое T из списка параметров.

struct MyType { typedef int type; };

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

Конечно, в вашем случае, именно диграф <:, который означает то же самое, что и [, вызывает вашу проблему. Поставьте пробел, например < ::string>, чтобы избежать проблемы.

8
ответ дан 16 December 2019 в 21:36
поделиться

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

namespace std
{
    void swap(Foo& x, Foo& y)
    {
        x.swap(y);
    }
}
0
ответ дан 16 December 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: