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