Вот код, который не компилируется.
namespace ns
{
class foo
{
template <typename T> int bar (T *);
};
}
template <typename T>
int ns :: foo :: bar (T*) // this is OK
{
return 0;
}
template <>
int ns :: foo :: bar <int> (int *) // this is an error
{
return 1;
}
Ошибка: "специализация" template int ns:: foo:: bar (T *) в разных пространствах имен [-fpermissive] из определения "template int ns:: foo:: bar (T *)"
Вот версия, которая компилируется:
namespace ns
{
class foo
{
template <typename T> int bar (T *);
};
}
template <typename T>
int ns :: foo :: bar (T*)
{
return 0;
}
namespace ns
{
template <>
int foo :: bar <int> (int *)
{
return 1;
}
}
Почему второе определение должно быть в блоке namespace ns {}
, когда первый из них довольно удачно определен с помощью квалифицированного имени? Это просто недосмотр в дизайне языка или есть причина для этого?