2014-11-05 6 views
0

내가 다음 코드 조각에 의해 의아해하고 같이 초기화리스트를 사용하는 경우 : I main()에서 3 번째 코드 라인을 유엔의 주석 경우모호함 매개 변수

#include <Eigen/Dense> 
#include <vector> 

class Foo {}; 

void f(Eigen::MatrixXd const &) {} 
void f(std::vector<Eigen::MatrixXd> const &) {} 

void g(Foo const &) {} 
void g(std::vector<Foo> const &) {} 

int main() 
{ 
    Foo a, b, c; 
    Eigen::MatrixXd x, y, z; 

    // f({x, y}); ambiguity, why?! 
    f({x, y, z}); // ok 

    g({a,b}); // ok 
    g({a,b,c}); // ok 
} 

, 내가 얻을 모호한 호출 오류,

/Users/vlad/so.cpp: In function 'int main()': 
/Users/vlad/so.cpp:17:13: error: call of overloaded 'f(<brace-enclosed initializer list>)' is ambiguous 
    f({x, y}); //ambiguity, why?! 
      ^
/Users/vlad/so.cpp:17:13: note: candidates are: 
/Users/vlad/so.cpp:6:6: note: void f(const MatrixXd&) 
void f(Eigen::MatrixXd const &) {} 
    ^
/Users/vlad/so.cpp:7:6: note: void f(const std::vector<Eigen::Matrix<double, -1, -1> >&) 
void f(std::vector<Eigen::MatrixXd> const &) {} 

init 목록의 3 개 항목을 사용하여 호출 할 수 있습니다.

그러나 Eigen 행렬 대신에 Foo 클래스를 사용하면 (함수 g 참조) 모든 것이 올바르게 작동합니다. Eigen을 사용할 때 주석이 달린 행이 모호한 이유는 전혀 알지 못합니다. 어떤 아이디어?

추신 : f을 오버로드하여 std::initializer_list<Eigen::MatrixXd>이 걸리면 문제가 사라지고 모호한 호출이 없어집니다.

+0

'Eigen :: MatrixXd'는 집합체입니까? –

+0

@KerrekSB, 확실하지 않은 것 같습니다. 왜? POD 멤버를 추가하여'Foo'를 집합체로 만들면 아무 것도 바뀌지 않습니다. – vsoftco

+0

@KerrekSB [생성자] (http://eigen.tuxfamily.org/dox/classEigen_1_1Matrix.html)가있는 것 같습니다. – user657267

답변

4

오류는 this constructor template이 원인 일 가능성이 큽니다.

template<typename T0, typename T1> 
EIGEN_DEVICE_FUNC 
EIGEN_STRONG_INLINE Matrix(const T0& x, const T1& y) 
{ ... } 

그 생성자와 vectorinitializer_list 생성자 모두

는 모호한 오류로 이어지는 함수 호출 f({x, y});에서 동등하게 좋은 경기입니다.

Here's a made up example과 유사한 생성자 및 함수 호출을 사용하면 모호성 오류가 발생할 수도 있습니다.