2014-11-03 3 views
0

코드 고려 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 조건으로 간단히 truefalse을 사용하고 있습니다.

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>' 
+0

당신이 (이 작업)이 작동 구조 전문 ... 함께 할 경우 내 생각 SFINAE를 들어 – CollioTV

+0

는, 조건이 템플릿 매개 변수의 의존한다. – Jarod42

+1

'template <> inline CByteArray serialize (const HLVariant & value)'템플릿 인자를 명시 적으로 지정하지 않으므로 컴파일러는 (함수 인자 유형에서) 그것을 추론해야합니다. 그러나'serialize' 템플릿 둘 모두에 대해'T'는 추론되지 않은 상황에 있기 때문에 불가능합니다. – dyp

답변

2

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 
} 
+0

아니, 작동하지 않습니다. 질문에 대한 최근의 추가 내용을 확인하십시오. –

+0

http://ideone.com/WTaWpD –

+0

'true '/'false'는'T'에 의존하지 않으므로 대체 오류가 아닌 하드 오류가 발생합니다. – Jarod42