2014-08-29 3 views
1

У меня есть класс с переменной-членом, которая является std::vector<double>. Я хотел бы инициализировать это в списке инициализации класса. Я попытался следующий кодКак инициализировать этот вектор-член в C++ 11-стиле?

MyClass::MyClass() 
    : m_myMemberVector({ 1.0, 2.0 }) 
{...} 

но компилятор интерпретирует это как (itBegin, itEnd) конструктор std::vector. Я видел этот вопрос error: ‘double’ is not a class, struct, or union type, который указывает на проблему ввода итератора, но не дает решения.

У меня есть рабочая реализация с использованием BOOST в теле конструктора, но я предпочел бы сделать это в списке инициализации, если это возможно. Есть ли какой-либо элегантный способ построения вектора, содержащего два удвоения с использованием инициализации в стиле 11 + C++?

+4

Звучит как ошибка. Какой компилятор вы используете? –

+7

Вы уверены, что выбран конструктор? Можете ли вы опубликовать код, чтобы доказать это? В любом случае, попробуйте исключить '()', i.e 'm_myMemberVector {1.0, 2.0}'. – juanchopanza

+2

Удалить фигурные скобки 'm_myMemberVector {1.0, 2.0}' – user1810087

ответ

2

std::initializer_list<double>{ 1.0, 2.0 } вместо { 1.0, 2.0 } мог работать, как смог бы удалить () вокруг { 1.0, 2.0 }.

Коэффициенты - это ошибка в вашем компиляторе, поэтому помощь может стать более явной.

Другая возможность заключается в том, что m_myMemberVector фактически не является std::vector<double> или что ваша стандартная библиотека, которую вы используете, не включена в C++ 11.

2

Простое решение было правильно: C++ 11 был неправильно включен. Я видел компиляторный выход формы

MyClass.cxx:5:5: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default] 

и предположил, что это означает, что поддержка C++ 11 будет «включена по умолчанию»! Перекомпиляция с явным использованием -std=c++11 работала должным образом.

Был ответ, предлагающий это, который я хотел принять, но он, кажется, был удален. Спасибо за все комментарии, которые сделали это.

+1

FYI, вам не нужно принимать другой ответ, как вы делали в настоящее время. Вы можете, например, принять этот, свой собственный, ответ после определенного тайм-аута. –

+1

также, '' [включен по умолчанию] '' относится к предупреждению. другие предупреждения отображаются как '' [-Wfoobar] ''. И всегда компилируйте с помощью '' -Wall -Wextra -Werror'' (или, по крайней мере, '' -Werror''), если вы пишете новый код (и, следовательно, можете придерживаться определенных стандартов качества), это позволяет избежать множества ошибок. –

+0

Спасибо, Jonas Wielicki. Я предполагаю, что это было немного PEBKAC при интерпретации вывода компилятора! Я обычно компилирую эти флаги в своих проектах, но в этом случае у меня нет контроля над Makefile. – JamesR

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