Существует ли различие между следующими подходами?
// 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>
не работает, но по совершенно другой причине :)
Да, есть. Но не в этом конкретном примере. Если параметр не выводится, это может иметь значение
template<typename T> void f(typename T::type t);
Вы не можете специализировать это без <тип>
, потому что он не может вывести, что такое T
из списка параметров.
struct MyType { typedef int type; };
// needs <MyType>
template<> void f<MyType>(int t) { }
Конечно, в вашем случае, именно диграф <:
, который означает то же самое, что и [
, вызывает вашу проблему. Поставьте пробел, например <
::string>
, чтобы избежать проблемы.
Кроме того, вам не нужно специализироваться в этом случае, просто перегружайтесь и будьте счастливы.
namespace std
{
void swap(Foo& x, Foo& y)
{
x.swap(y);
}
}