Шаблон & л; & GT; синтаксис требуется 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 требуется шаблон»<Шаблон «(иначе выдает ошибку»)<> «Синтаксис требуется при явной специализации члена … ‘.

Поэтому мой вопрос в том, какой из них правильный и как заставить код компилироваться на всех этих платформах.

1

Решение

Солярис СС неверен. 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;
}

Если у вас их много, вы можете поместить этот шаблон в пользовательский макрос.

2

Другие решения

Вам не нужно

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

Wandbox

Ищите «Члены специализации» в C ++ Reference

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector