2016-01-24 90 views
0

Cygwin的Armadillo的C++ 11功能被禁用。但它適用於Linux。arma ::錯誤的std ::向量

我想我的代碼是跨平臺的。

起初:

// constructor 
MyClass(arma::vec x) 
{ 
    init(x); 
} 

當我通過一個數組,因爲犰狳的C++ 11點的選擇是不是在Cygwin啓用它沒有工作:

MyClass a({1.0,2.0,3.0}); 

這將導致在Cygwin中出現錯誤,而在Linux中工作。

要解決這個問題,我加入另一個構造函數修改了代碼:現在

// constructor 
MyClass(arma::vec x) 
{ 
    init(x); 
} 

// constructor 
MyClass(std::vector<double> x) 
{ 
    arma::vec x2; 
    for(auto d:x) 
     x2<d; 
    init(x2); 
} 

,此代碼的工作在Cygwin正常,但在Linux中它會導致錯誤。

MyClass a({1.0,2.0,3.0}); 

error: call of overloaded ... is ambiguous 

如何解決這個歧義?

+1

'init(x)'請停止使用2階段初始化。這就是C++ 11委託構造函數的用途。另外,修復Cygwin上的Armadillo問題不是更容易嗎? –

+0

@NicolBolas,犰狳是我手中的一個圖書館。 C++ 11不是Armadillo的問題,但它是Cygwin實現它不完整的問題。順便說一句,在這種情況下如何避免'init'?在創建'x2'之前,我無法調用另一個構造函數。 – ar2015

+0

我不知道Armadillo的'vec'類的細節,但像這樣:'MyClass(const std :: vector &x):MyClass(arma :: vec(x.begin(),x.end() ))'。或者他們的矢量類提供的任何其他接口。另外,我建議使用const的'std :: vector'參數而不是value,因爲你不會從它移動。 –

回答

2

創建ctor,接受std::initializer_list<double>

+0

工程像魅力。但它與'std :: vector '有什麼不同? – ar2015

+0

使用initializer_list的構造函數在傳遞支撐構造函數時強烈偏好 – RiaD