다음 서명을 사용하여 일반 벡터 템플릿 클래스 (컨테이너가 아닌 기하학적 엔티티)를 작성하고 있습니다 ...특정 조건이 충족 될 때 C++ 템플릿 클래스 메서드의 인스턴스화를 방지하려면 어떻게해야합니까?
template< typename T, unsigned N >
class vector
{...}
... 여기서 T는 산술 유형이고 N은 차원입니다. 교차 곱을 연산자^(클래스 정의 내부에 있음)의 오버로드로 정의하고 N == 3 인 경우에만 사용 가능하게하려고합니다.
typename boost::lazy_enable_if_c< (N == 3), vector >::type
inline operator ^(const vector &rhs) const
{
vector ret;
ret(0) = val_[1] * rhs(2) - val_[2] * rhs(1);
ret(1) = val_[2] * rhs(0) - val_[0] * rhs(2);
ret(2) = val_[0] * rhs(1) - val_[1] * rhs(0);
return ret;
}
불행히도이 템플릿을 인스턴스화하면 N! = 3 인 경우 연산자 ^가 참조되지 않아도 다음 오류가 발생합니다.
error: no type named ‘type’ in ‘struct boost::lazy_enable_if_c < false, flare::math::vector < flare::math::fixed < short int, 8u >, 2u > >’
무엇이 잘못 되었나요? 이 경우 boost :: enable_if에 대한 대안이 있습니까?
대단히 감사합니다.
우선, 깊이있는 설명을 해주셔서 감사드립니다.사실, typedef vector 타입을 가지고 있습니다. 내 클래스 정의 내에서, 그러나 나는이 중요한 세부 사항을 언급하는 것을 잊었다. 그래서 GCC가 왜이 에러를 던지고 있는지 이해하지 못했습니다 :: 정의되지 않았습니다. 또한, 나는 enable_if의 lazy_ 버전의 목적을 오해했습니다. 당신의 설명이 나를 이해하는 데 도움이되었습니다. 이것에 비추어 볼 때, 저는 단순히 연산자의 바깥 쪽 버전으로 바뀌 었습니다.^예상대로 작동했습니다. N! = 3 일 때 생성 된 오류 메시지는 조금 이해가되지 않지만이를 처리 할 수 있습니다. 다시 한번 고마워요! – pmjobin
@pmjobin : 환영합니다 :) 예, 템플릿 오류 메시지는 끔찍합니다 ... –