template‹› синтаксис, требуемый 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;
}

с «template‹>» в определении MSVC возвращает ошибку C2910, так как интерпретирует operator() как метод шаблона, а не метод класса шаблона. GCC ведет себя аналогично. Но Solaris CC требует «шаблон‹>» (в противном случае он выдает ошибку «требуется синтаксис «шаблон‹>» при явной специализации члена ...'.

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


person Jane2004    schedule 16.10.2017    source источник
comment
обязательно прочитайте это: stackoverflow.com/questions/495021/   -  person bolov    schedule 17.10.2017
comment
@bolov Этот совет применим только к определениям, которые имеют хотя бы один параметр шаблона. В этом специализированном operator() определении нет ни одного.   -  person aschepler    schedule 17.10.2017


Ответы (2)


Солярис CC неверен. template<> не разрешено. Стандарт С++ 14 [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;
}

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

person aschepler    schedule 17.10.2017

Вам не нужно

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++.

person Andriy Tylychko    schedule 16.10.2017