C++ 如何使用std::enable_if on方法对模板化类进行专门化,并通过专门化分别声明和定义

C++ 如何使用std::enable_if on方法对模板化类进行专门化,并通过专门化分别声明和定义,c++,c++11,templates,enable-if,C++,C++11,Templates,Enable If,我试图使用专门化在头文件和实现之间分割一个模板类,但我希望一个方法只出现在某些专门化中 头文件: template <typename T> class A { public: void foo(); void bar(); template<typename U = T, typename std::enable_if<std::is_convertible<int,U>::value>::type* = nullptr>

我试图使用专门化在头文件和实现之间分割一个模板类,但我希望一个方法只出现在某些专门化中

头文件:

template <typename T>
class A
{
  public:
  void foo();
  void bar();

  template<typename U = T, typename std::enable_if<std::is_convertible<int,U>::value>::type* = nullptr>
  void special();
};
实施:

template<typename T>
void A<T>::foo()
{
  ...
}

template<typename T>
void A<T>::bar()
{
  ...
}

template<typename T, typename std::enable_if<std::is_convertible<int,T>::value>::type>
void A<T>::special()
{
  ...
}

// generate specializations
template
class A<float>;

template
class A<int>;

template
class A<std::string>;

然而,我不断得到错误:当我这样尝试时,或者当我将std::enable_作为返回类型时,声明与函数模板void A::special不兼容。定义应该如何匹配此特殊方法的声明?

此代码存在一些问题。在声明中,有一个额外的尖括号。此外,*紧跟着=将始终被解释为单个标记*=;在这段代码中,它们必须用空格分隔,以便*被解释为形成指针,=被解释为声明模板参数的默认值。因此,宣言应改为:

template<typename U = T,
         typename std::enable_if<std::is_convertible<int,U>::value>::type* = nullptr>
void special();
请注意,此处U的准确拼写并不重要:我们可以重新标记U,因为它是一个伪变量:

template <typename T>
template <typename V, typename std::enable_if<std::is_convertible<int,V>::value>::type*>
void A<T>::special()
{
    // ...
}

但是,除了重新标记外,所有其他细节都必须完全匹配。

@unglish\u mark这些都是我根据真实代码创建最小示例时的错误。它们已得到纠正。谢谢。同样,T也可以重新标记为:模板模板void A::special。
template <typename T>
template <typename V, typename std::enable_if<std::is_convertible<int,V>::value>::type*>
void A<T>::special()
{
    // ...
}