코드 고려 SFINAE (표준 : enable_if) 및 템플릿 특수화를 사용하기 :컴파일 오류가 때
C2912: explicit specialization 'CByteArray serialize(const HLVariant &)' is not a specialization of a function template
error C2783: 'CByteArray serialize(const std::enable_if::type &)' : could not deduce template argument for 'T'
오류가 있음을 시사 :
#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;
}
마이크로 소프트 비주얼 스튜디오 2013은 다음과 같은 오류를 제공합니다 컴파일러에서 볼 수있는 template <typename T> CByteArray serialize(const T&);
함수가 없으며 그 이유를 이해할 수 없습니다. 테스트 목적으로 여기에 enable_if
조건으로 간단히 true
및 false
을 사용하고 있습니다.
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();
}
이제 오류는 다음과 같습니다 : 나는 또한 (대신 인수의 반환 형식에 enable_if
) 대신이 방법을 시도했습니다
C2039: 'type' : is not a member of 'std::enable_if<false,CByteArray>'
당신이 (이 작업)이 작동 구조 전문 ... 함께 할 경우 내 생각 SFINAE를 들어 – CollioTV
는, 조건이 템플릿 매개 변수의 의존한다. – Jarod42
'template <> inline CByteArray serialize (const HLVariant & value)'템플릿 인자를 명시 적으로 지정하지 않으므로 컴파일러는 (함수 인자 유형에서) 그것을 추론해야합니다. 그러나'serialize' 템플릿 둘 모두에 대해'T'는 추론되지 않은 상황에 있기 때문에 불가능합니다. – dyp