[英]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.