Синтаксис шаблона <> требуется Solaris CC, но запрещен MSVC и GCC
У меня есть следующий код в заголовочном файле:
template<typename A, typename B> class TemplateTest;
template<>
class TemplateTest<int, double>
{
public:
float operator() (float a);
};
Определение в файле cpp:
template<> // this is problematic line
float TemplateTest<int, double>::operator()(float a)
{
float b;
b = a + 5;
return b;
}
с помощью "шаблона<>" в определении MSVC возвращает ошибку C2910, поскольку она интерпретирует operator() как метод шаблона, а не метод класса шаблона. GCC ведет себя аналогично. Но Solaris CC требует "template<>" (иначе он выдает ошибку "синтаксис" template<> "требуется при явной специализации члена...").
Поэтому мой вопрос в том, какой из них правильный и как заставить код компилироваться на всех этих платформах.
2 ответа
Солярис СС неверен. template<>
не допускается C++14 Standard [temp.expl.spec]/5:
Члены явно специализированного шаблона класса определяются так же, как и члены обычных классов, и не используют
template<>
синтаксис....[ Пример:
template<class T> struct A {
struct B { };
template<class U> struct C { };
};
template<> struct A<int> {
void f(int);
};
void h() {
A<int> a;
a.f(16); // A<int>::f must be defined somewhere
}
// template<> not used for a member of an
// explicitly specialized class template
void A<int>::f(int) { /*...*/ }
... - конец примера ]
Похоже, что для поддержки Solaris CC вам придется использовать что-то вроде:
#ifdef __SUNPRO_CC
template <>
#endif
float TemplateTest<int, double>::operator()(float a)
{
float b;
b = a + 5;
return b;
}
Если у вас их много, вы можете поместить этот шаблон в пользовательский макрос.
Вам не нужно
template<> // this is problematic line
Полный пример:
template<typename A, typename B> class TemplateTest;
template<>
class TemplateTest<int, double>
{
public:
float operator() (float a);
};
float TemplateTest<int, double>::operator()(float a)
{
return 0;
}
Ищите "Члены специализаций" в C++.