[英]Compilation errors when attempting to use SFINAE (std::enable_if) and template specialization
考慮一下代碼:
#include <type_traits>
struct CByteArray {};
struct HLVariant {
HLVariant() {}
HLVariant(const HLVariant&) {}
HLVariant(const CByteArray&) {}
};
template <typename T>
inline CByteArray serialize(const typename std::enable_if<true, T>::type& value)
{
return serialize(HLVariant(value));
}
template <typename T>
inline CByteArray serialize(const typename std::enable_if<false, T>::type& value)
{
return CByteArray();
}
template <>
inline CByteArray serialize(const HLVariant& value)
{
return CByteArray();
}
int main()
{
serialize(0);
serialize(CByteArray());
serialize(HLVariant());
return 0;
}
Microsoft Visual Studio 2013給出以下錯誤:
C2912:顯式專門化'CByteArray serialize(const HLVariant&)'不是功能模板的專門化
錯誤C2783:'CByteArray serialize(const std :: enable_if :: type&)':無法推斷出'T'的模板參數
該錯誤表明沒有template <typename T> CByteArray serialize(const T&);
函數對編譯器可見,我不明白為什么。 請注意,在這里我只是將true
和false
用於enable_if
條件用於測試目的。
我也嘗試過這種方式(在返回類型而不是參數上啟用enable_if
):
template <typename T>
inline typename std::enable_if<true, CByteArray>::type serialize(const T& value)
{
return serialize(HLVariant(value));
}
template <typename T>
inline typename std::enable_if<false, CByteArray>::type serialize(const T& value)
{
return CByteArray();
}
現在錯誤是:
C2039: 'type' : is not a member of 'std::enable_if<false,CByteArray>'
typename std::enable_if<true, T>::type
在您的上下文中是不可扣除的(編譯器應測試該T
,對於一般情況它可能是無限類型)。
您可以改用:
template <typename T>
inline
typename std::enable_if</*your condition depending of T*/, CByteArray>::type
serialize(const T& value)
{
// Your code
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.