2014-02-07 3 views
2

나는 코드와 같은 조각C++ 조건 템플릿 유형

namespace bg = boost::geometry; 
    typedef typename std::conditional<highDimension, 
            typename bg::model::point<double, 6, bg::cs::cartesian>, 
            typename bg::model::point<double, 5, bg::cs::cartesian>>::type point; 
    .......... 
    point p;      
    p.set<0>(0); 
    p.set<1>(0); 
    p.set<2>(0); 
    .......... 

는 GCC가 나에게 오류 "와 같은 오류를 많이 보여이 : 운영자 < '바이너리'유형의 유효하지 않은 피연산자 ''과 '지능 ' p.set < 1> (col.a()); " 그래서 그냥 '비교'하려고합니다 p.set1

부스트 클래스는 실제로 템플릿 함수 세트를 가지고 있지만 컴파일러는 함수로 사용하지 않습니다.

부스트 유형에서 직접 typedef를 만들면 typedef bg::model::point<double, 5, bg::cs::cartesian> point;과 같이 모든 것이 잘 동작합니다.

템플릿 인수 highDimension에 따라 다른 크기 크기를 선택하고 싶습니다. 당신이 이유에

p.template set<0>(0); 

을 :하지만 지금은 GCC가 highDimension 이후

답변

5

템플릿 인수 나를 :)를 이해 강제하는 방법을 몰라 여기 template를 작성해야하므로, point는 의존의 형태가된다

,691 : 여기에 대답을,이 template 필요 읽기

BTW, 당신은 인수 typename 필요하지 않습니다 : 또한 using를 사용할 수

typedef typename std::conditional<highDimension, 
       bg::model::point<double, 6, bg::cs::cartesian>, 
       bg::model::point<double, 5, bg::cs::cartesian>>::type point; 

:

using point = typename std::conditional<highDimension, 
       bg::model::point<double, 6, bg::cs::cartesian>, 
       bg::model::point<double, 5, bg::cs::cartesian>>::type; 

이보기 (IMHO)의 가독성 지점에서 더 나은 모습을.

또는 당신은 단순히이를 작성할 수

using point = bg::model::point<double, highDimension?6:5, bg::cs::cartesian>; 

더 나은 같습니다.

+1

대단히 감사합니다. 예상대로 작동합니다. – johngull

+1

+1 C++ 11 유형 별칭의 경우. 오래된'typedef'보다 수천 번 더 읽기 쉽습니다. – Manu343726

+0

이 'p 템플릿 설명 <0> (0);에 대해 읽을 수있는 곳을 가르쳐 주시겠습니까? 건설 – johngull