2016-12-15 6 views
1

나는 컴파일하고 예상대로 작동 처음있는 코드의 두 세트를 가지고 있지만, 불필요하게 자세한 [로 나타나는]입니다 : 이것은 오히려 쓰기하려는 코드가형식 특성이있는 템플릿 메타 프로그래밍 : 왜 첫 번째 코드는 컴파일되고 두 번째 코드는 그렇지 않습니까?

template<point_type type, typename T> 
struct point2d_base { 
    std::enable_if_t<std::is_arithmetic_v<T>, T> x, y; 
    template<point_type t2 = type> 
    point2d_base(std::enable_if_t<t2 == point_type::generic, T> x = 0, T y = 0) : 
     x(x), y(y) {} 
    template<point_type t2 = type> 
    explicit point2d_base(std::enable_if_t<t2 != point_type::generic, T> x = 0, T y = 0) : 
     x(x), y(y) {} 
/*Some unrelated code*/ 
}; 

,하지만 난 나는 이런 식으로 할 경우 많은, 많은 컴파일 오류를 얻을 : generic, corner, center :

참조를 위해서
template<point_type type, typename T> 
struct point2d_base { 
    std::enable_if_t<std::is_arithmetic_v<T>, T> x, y; 
    point2d_base(std::enable_if_t<type == point_type::generic, T> x = 0, T y = 0) : 
     x(x), y(y) {} 
    explicit point2d_base(std::enable_if_t<type != point_type::generic, T> x = 0, T y = 0) : 
     x(x), y(y) {} 
/*Some unrelated code*/ 
}; 

point_type는 세 개의 값을 포함하는 '열거 클래스 "입니다.

제 질문은 : 왜 첫 번째 코드가 컴파일되고 두 번째 코드는 컴파일되지 않는 것입니까?

답변

1

std::enable_if을 사용하기 위해 템플릿 클래스 매개 변수를 사용할 수 없습니다. std::enable_if에 함수를 사용하려면이 함수를 템플릿 함수로 만들어야합니다. 클래스 템플릿이 인스턴스화되면 해당 클래스의 모든 멤버 함수가 인스턴스화되기 때문입니다. 템플릿 함수를 조건부로 활성화하려면 템플릿 멤버 함수가 필요합니다. (제 추측이고 정확하다고 생각합니다.)

+0

두 번째 예제에서 작성한 코드의 정확한 버전이 있습니다. 여기서'type' 변수를 다음과 같이 재 선언 할 필요가 없습니다. 다른 것? – Xirema

+0

'std :: enable_if'를 사용하고 싶다면 그렇게 생각하지 않습니다. 요구 사항에 따라 다른 옵션은 템플릿 전문화가 될 수 있습니다. – MRB