2017-05-23 8 views
3

다음 코드는 예기치 않게 (0, 1, 0) 대신 (0, -1, 0)을 할당합니다. 왜? 어떤 아이디어? 어떻게됩니까고유 및 삼항 연산자가있는 원하지 않는/예기치 않은 컴파일러 - 마법

#include <Eigen/Dense> 

int main() 
{ 
    const bool useFirst = false; 

    // This is the original use-case. 
    const Eigen::Vector3d vect1 
    = useFirst ? -Eigen::Vector3d::UnitZ() : Eigen::Vector3d::UnitY(); 

    // This version is somewhat simplified, but exhibits the same problem. 
    const Eigen::Vector3d unitZ(0.0, 0.0, 1.0), unitY(0.0, 1.0, 0.0); 
    const Eigen::Vector3d vect2 = useFirst ? -unitZ : unitY; 

    // FYI, this version does not compile (?). 
    // const Eigen::Vector3d vect3 
    // = useFirst ? -unitZ : Eigen::Vector3d::UnitY(); 
} 
+0

내 컴퓨터에서'vect1' 버전은 컴파일되지 않지만'vect2' 버전은 의도 한대로 (0, 1, 0)을 생성합니다. – Cholts

답변

3

unitZVector3d 경우 -unitZ는 식 템플릿 const CwiseUnaryOp<internal::scalar_opposite_op<double>, const Vector3d>를 반환한다는 것입니다. 초기 버전의 Eigen에서는 ?: 연산자의 'else'매개 변수가 암시 적으로 해당 유형으로 캐스팅되어 비 의도적으로이를 무효화했습니다. 얼마 전에 대부분의 생성자를 만들어서 허용하지 않았습니다 explicit - 먼저 Eigen 버전을 업데이트해야합니다. 실제 솔루션을

는 : 아이겐 표현과 ?: 연산자 (간단한 if-else 분기를 사용)를 피하거나 가능하지 않은 경우, 명시 적으로 원하는 유형의 마지막 매개 변수를 캐스트 :

typedef Eigen::Vector3d Vec3d; 
const Vec3d vect1 = useFirst ? Vec3d(-Vec3d::UnitZ()) : Vec3d(Vec3d::UnitY()); 

관련 질문 : Type error in ternary operator in Eigen

+0

'(...) .eval()'을 사용하여 강제로 표현식 템플리트를 평가할 수도 있습니다. –