0

Функции C++ 11 от Armadillo отключены на Cygwin. Но он работает на Linux.arma :: vector mistaken with std :: vector

Я хочу, чтобы мой код был кросс-платформенным.

В первый:

// 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

'инициализации (х)' Пожалуйста, прекратите использование 2-этап инициализации. Для этого нужны конструкторы делегирования C++ 11. Кроме того, было бы проще просто исправить проблему Armadillo на Cygwin? –

+0

@NicolBolas, Armadillo - это библиотека из моей руки. C++ 11 не является проблемой Armadillo, но проблема Cygwin заключается в том, чтобы реализовать его неполную. Кстати, как избежать 'init' в этом случае? Я не могу вызвать другой конструктор, прежде чем создать «x2». – ar2015

+0

Я не знаю деталей класса 'vec' Армадилло, но что-то вроде этого:' MyClass (const std :: vector & x): MyClass (arma :: vec (x.begin(), x.end())) '. Или любой другой интерфейс, который предоставляет их векторный класс. Кроме того, я бы предложил взять параметр 'std :: vector'' const & 'вместо значения, так как вы не собираетесь переходить от него. –

ответ

2

создать CTOR, который принимает std::initializer_list<double>

+0

Работает как шарм. Но как он отличается от 'std :: vector '? – ar2015

+0

Конструкторы с параметром initializer_list настоятельно предпочтительнее, когда вы передаете готовый инициализатор – RiaD

Смежные вопросы