模板<> Solaris CC所需的语法,但MSVC和GCC禁止

时间:2017-10-16 22:55:53

标签: c++ templates gcc cc

我在头文件中有以下代码:

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&lt;&gt;”在定义中,MSVC返回错误C2910,因为它将operator()解释为模板方法而不是模板类的方法。 GCC表现相似。但Solaris CC需要“模板&lt;&gt;” (否则它会发出错误'“template&lt;&gt;”语法在明确专门化...的成员时是必需的。

所以我的问题是哪一个是正确的以及如何在所有这些平台上编译代码。

2 个答案:

答案 0 :(得分:2)

Solaris CC不正确。 template<>是不允许的。 C ++ 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;
}

如果您有很多这些,可能需要将该样板放入自定义宏。

答案 1 :(得分:0)

您不需要

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

中查找“专业化成员”