2010-05-04 6 views
3

누군가 Visual Studio 2010을 사용하여 다음과 같은 동작을 설명 할 수 있습니까?
헤더 :SFINAE 열거 형 템플릿 매개 변수로 오류가 발생했습니다.

#pragma once 
#include <boost\utility\enable_if.hpp> 
using boost::enable_if_c; 

enum WeekDay {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}; 

template<WeekDay DAY> 
typename enable_if_c< DAY==SUNDAY, bool >::type goToWork() {return false;} 

template<WeekDay DAY> 
typename enable_if_c< DAY!=SUNDAY, bool >::type goToWork() {return true;} 

소스 :

bool b = goToWork<MONDAY>(); 

컴파일러이

error C2770: invalid explicit template argument(s) for 'enable_if_c<DAY!=6,bool>::type goToWork(void)' 

error C2770: invalid explicit template argument(s) for 'enable_if_c<DAY==6,bool>::type goToWork(void)' 

을 제공하지만 함수 템플릿 페이지를 변경하는 경우 거기에는 놀라움,

template<int DAY> 
typename enable_if_c< DAY==SUNDAY, bool >::type goToWork() {return false;} 

template<int DAY> 
typename enable_if_c< DAY!=SUNDAY, bool >::type goToWork() {return true;} 

또한 정상적인 기능 템플릿 특수화가 잘 작동 : 열거 형 평일에서 arameter는 잘 컴파일, int로 없습니다

template<WeekDay DAY> bool goToWork()   {return true;} 
template<>    bool goToWork<SUNDAY>() {return false;} 

물건도 괴상하기 위해, 나는를 변경하는 경우

error C2440: 'specialization' : cannot convert from 'int' to 'const WeekDay' 
Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast) 

편집 : 어쩌면 누군가가 DIF와이를 테스트 할 수 소스 파일은 다음과 오류 변경 bool b = goToWork<THURSDAY>(); 즉, 월요일 또는 화요일,보다 다른 평일 사용 (Visual Studio 2010 이외의) 컴파일러를 사용하여 동일한 일이 발생하는지 확인하십시오. 아무런 의미가없는 것 같습니다.

편집 :이 동작의 새로운 "흥미로운"측면을 발견했습니다. 내가 헬퍼 구조체 템플릿과의 비교에 ==!= 사업자와 템플릿 매개 변수의 직접 비교를 변경하는 경우 즉, 그것을 잘 작동합니다 :

template<WeekDay DAY> 
struct Is 
{ 
    static const bool Sunday = false; 
}; 

template<> 
struct Is<SUNDAY> 
{ 
    static const bool Sunday = true; 
}; 

template<WeekDay DAY> 
typename enable_if_c< Is<DAY>::Sunday, bool >::type goToWork() {return false;} 

template<WeekDay DAY> 
typename enable_if_c< !Is<DAY>::Sunday, bool >::type goToWork() {return true;} 

는 편집 : 그런데 , 나는 버그 리포트를 만들어 이것은 Microsoft의 대답입니다. "이것은 non-type 템플릿 매개 변수를 승격하려고 시도 할 때 나타나는 버그입니다. 불행히도이 릴리스에 대한 리소스 제약 조건과 해결 방법을 사용할 수 있다면 수정하지 못할 것입니다. Visual Studio의 다음 릴리스에서 해결할 수 있습니다. 해결 방법은 템플릿 매개 변수 유형을 int로 변경하는 것입니다. "

는 GCC 4.2.1에서

답변

2

작품 미세 (I는 "이 릴리스는"비주얼 스튜디오 2010을 의미 생각).

VC의 템플릿 엔진에 열거 형에 대한 비교 연산자가 없거나 열거 형으로 int 열을 변환 한 다음 엄격하게 지정하고 암시 적 변환을 int (명백하게 예외 0과 1)로 허용하지 않기로 결정했습니다.

+0

나는 잘 모르고있다. 나는 또한 비교 연산자 ==와! =뿐만 아니라 논리적 인 연산자 &&와 ||도 또한 포함하고 있기 때문에 연산자가 어떻게 든 빠져 있다고 의심했다. 위력을 과시. Mac 사용자를 무시해 죄송합니다. – zeroes00

관련 문제