6

Следующий код компилирует ОК с помощью XCode 5.0, но не Visual Studio 2013.Как инициализировать переменную-член вектора в определении класса?

#include <vector> 

class VectorInit 
{ 
private: 
    std::vector<int> m_vector{1, 2, 3}; // fails to compile using VS 2013 
}; 

int main() 
{ 
    std::vector<int> vector{1, 2, 3}; 

    VectorInit vectorInit; 

    return 0; 
} 

Это ошибка, что отчеты Visual Studio:

Error 1 error C2664: 'std::vector<int,std::allocator<_Ty>>::vector(std::initializer_list<int>,const std::allocator<_Ty> &)' : cannot convert argument 3 from 'int' to 'const std::allocator<_Ty> &' c:\visual studio 2013\projects\vector-init\main.cpp 6 1 vector-init 

мне не удалось найти пример того, как для инициализации такого вектора в определении класса.

Какой именно компилятор?

Если синтаксис недействителен, является единственным вариантом для инициализации m_vector в списке инициализации конструктора?

+0

visual 2013 еще не в порядке с нестационарным членом в инициализации класса в каждом случае, агрегат не работает, только видя, например, конструктор копирования. initializer_list ctor тоже. – galop1n

+0

@ galop1n Извините, я не совсем понимаю ваш комментарий. Пожалуйста, уточните. – ksl

+0

в инициализации члена класса - это функция C++ 11, дебютирующая в VS2013. Но когда член является агрегатом, компилятор работает неправильно и вместо этого пытается использовать конструктор копирования. Он игнорирует слишком конструкторы, которые берут список инициализаторов и пытаются сопоставить параметры только с регулярными конструкторами. – galop1n

ответ

7

В инициализации членов класса C++ 11 функция дебютировав в VS2013. Но когда член является агрегатом, компилятор работает неправильно и вместо этого пытается использовать конструктор копирования. Он игнорирует конструкторы, которые также берут список инициализаторов и пытаются сопоставить параметры только с регулярными аргументами конструкторов.

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

class VectorInit 
{ 
private: 
    std::vector<int> m_vector { std::vector<int>{ 1, 2, 5, 7 } }; 
}; 
+0

Спасибо. Это сработало. – ksl

4

Как инициализировать переменную вектор члена в определении класса (C++ 11)

То, что вы делаете правильно. Он инициализирует член данных, чтобы иметь значения 1, 2, 3 всякий раз, когда вы создаете экземпляр VectorInit.

Однако, если вам нужен другой конструктор, который требует (), то вам нужен альтернативный синтаксис:

std::vector<int> m_vector = std::vector(5, 42); // five elements set to 42 

Какой компилятор является правильным?

Синтаксис действителен C++, поэтому компиляторы, отличные от VS, являются правильными.

Если ваш компилятор не поддерживает этот тип инициализации, можно добавить конструктор к классу, как обходным:

class VectorInit 
{ 
public: 
    VectorInt() : m_vector{1, 2, 3}{} 
private: 
    std::vector<int> m_vector; 
}; 
+0

Почему не частный (один векторный конструктор принимает initializer_list)? –

+0

@ DieterLücking Это еще один вариант, хотя он касается другой проблемы (как и мой второй пример на самом деле). – juanchopanza

+0

@juanchopanza Компилятор VS 2013 также не примет этот синтаксис. – ksl

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