2014-11-05 52 views
0

我用下面這段代碼不解的是:歧義使用初始化列表作爲參數

#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 
} 

如果我取消註釋中main() 3次代碼行,我得到一個模棱兩可的調用錯誤,

/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個項目調用它。但是,如果不是使用特徵矩陣,而是使用我自己的類Foo(請參閱函數g),則一切正常。我完全不知道爲什麼使用Eigen時註釋行不明確。有任何想法嗎?

PS:如果我重載f,因此需要std::initializer_list<Eigen::MatrixXd>,那麼問題就會消失,不會再有模糊的呼叫。

+0

「Eigen :: MatrixXd」是一個聚合嗎? – 2014-11-05 05:08:20

+0

@KerrekSB,不確定,可能不會。爲什麼?如果我通過添加POD成員使'Foo'成爲一個聚合,則沒有任何變化。 – vsoftco 2014-11-05 05:10:38

+0

@KerrekSB它似乎有[構造函數](http://eigen.tuxfamily.org/dox/classEigen_1_1Matrix.html),所以沒有。 – user657267 2014-11-05 05:12:29

回答

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具有類似的構造函數和函數調用,也會導致模糊性錯誤。