2011-09-27 2 views
1

나는 enable_if로 주변을 어지럽 혀 왔고, 나는 모순 된 행동을 발견했습니다. 이것은 VS2010에 있습니다. 나는 그것을 다음 샘플로 줄였습니다.std :: enable_if 전문화가 실패했습니다.

#include <type_traits> 

using namespace std; 

// enable_if in initial template definition 
template <class T, class Enable = enable_if<true>> struct foo {}; 

foo<int> a; //OK 

// explicit specialisation 
template <class T, class Enable = void> struct bar; 
template <class T> struct bar<T, void> {}; 

bar<int> b; //OK 

// enable_if based specialisation 
template <class T, class Enable = void> struct baz; 
template <class T> struct baz<T, std::enable_if<true>> {}; 

baz<int> c; //error C2079: 'c' uses undefined struct 'baz<T>' 

이 코드는 컴파일러의 버그입니까?

답변

3

귀하의 문제는 enable_if

// you declare a structure named baz which takes 2 template parameters, with void 
// as the default value of the second one. 
template <class T, class Enable = void> struct baz; 
// Partial specialization for a baz with T and an std::enable_if<true> 
template <class T> struct baz<T, std::enable_if<true>> {}; 

// Declare a baz<int, void> (remember the default parameter?): 
baz<int> c; //error C2079: 'c' uses undefined struct 'baz<T>' 

baz<int, void> 그 시점에서 불완전한 유형이 함께 할 거의있다. 제임스가 말했듯이, 당신은 잘못 enable_if를 사용하고,

template <class T, class U = void> 
struct S; 

template <class T> 
struct S<T, int> 
{ }; 

S<double> s; 

그리고 : 같은 문제가 enable_if없이 발생합니다. Boost's documentation for enable_if 좋은 일을 설명해줍니다.

6

std::enable_if<true>typename std::enable_if<true>::type이어야합니다.

std::enable_if<true>은 항상 std::enable_if<false>과 같습니다. 조건이 거짓 일 때 대입을 실패로 만들려면 type 중첩 된 typedef를 사용해야합니다.이 조건은 조건이 참일 경우에만 정의됩니다.

+0

물론. 감사! – Ayjay

+0

@McNellis : "조건이 거짓 일 때 대체가 실패하면 조건이 참인 경우에만 정의되는 유형의 중첩 된 typedef를 사용해야합니다."... 이것이 의미가 있습니까? 그건 당신이 실패 할 대체품을 얻을 수 없다는 것을 의미합니다. 그게 네가하는 말의 의미인가? –