나는 컴파일하고 예상대로 작동 처음있는 코드의 두 세트를 가지고 있지만, 불필요하게 자세한 [로 나타나는]입니다 : 이것은 오히려 쓰기하려는 코드가형식 특성이있는 템플릿 메타 프로그래밍 : 왜 첫 번째 코드는 컴파일되고 두 번째 코드는 그렇지 않습니까?
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
는 세 개의 값을 포함하는 '열거 클래스 "입니다.
제 질문은 : 왜 첫 번째 코드가 컴파일되고 두 번째 코드는 컴파일되지 않는 것입니까?
두 번째 예제에서 작성한 코드의 정확한 버전이 있습니다. 여기서'type' 변수를 다음과 같이 재 선언 할 필요가 없습니다. 다른 것? – Xirema
'std :: enable_if'를 사용하고 싶다면 그렇게 생각하지 않습니다. 요구 사항에 따라 다른 옵션은 템플릿 전문화가 될 수 있습니다. – MRB