簡體   English   中英

如何在模板化類的方法上通過特殊化使用單獨的聲明和定義來使用std :: enable_if

[英]How to use std::enable_if on method of templated class with seperate declaration and definition via specialization

我正在嘗試使用專用化將頭文件和實現之間的模板化類拆分,但是我希望一種方法僅出現在某些專用化中。

頭文件:

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

但是,我不斷收到error: declaration is incompatible with function template "void A<T>::special()"當我這樣嘗試或將std::enable_if設置為返回類型時, error: declaration is incompatible with function template "void A<T>::special()" 定義應如何匹配此方法的聲明special()

此代碼存在一些問題。 在聲明中,您有一個額外的尖括號。 同樣,緊跟在=之后的*將始終被解釋為單個標記*= ; 在此代碼中,必須將它們用空格隔開,以便*可以解釋為形成指針,而=可以聲明為模板參數的默認值。 因此,聲明應為:

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

在定義中,由於要定義類模板的成員模板,因此需要先寫出類模板的模板參數列表,然后寫出成員模板。 另外,您的定義中沒有足夠的模板參數:請記住, U也在那里,並且需要在is_convertible部分中出現的是U ,而不是T

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

請注意,此處的U的確切拼寫並不重要:我們可以重新標記U因為它是“虛擬變量”:

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

但是,除了重新標記外,所有其他詳細信息都必須完全匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM