2013-03-15 2 views
3

Мне нужно использовать в программных векторах C++, содержащих c-строку wchar_t. Я пытался сделать это так:Как объявить вектор wchar_t [] в C++?

using std::vector; 

vector<wchar_t[SIZE]> string_list(100); 

Но я получаю большой вывод ошибок, содержащий следующие слова:

error: functional cast to array type «std::vector<wchar_t [512]>::value_type {aka wchar_t [512]}» 

Что я делаю неправильно? Почему я получаю такую ​​ошибку?

ответ

4

К сожалению сырых массивы не соответствуют требованиям * std::vector «s для типа элемента из-за многочисленные странности типов массивов.

Если вы действительно хотите массивы фиксированного размера, вы должны использовать std::array<wchar_t,SIZE>, как std::array шаблона устраняет проблемы с сырьевыми массивами и вместо этого производит объекты, которые действуют как собственные значения (например, std::array<wchar_t,SIZE> присваиванию, тогда как сырые массивы не являются) ,

Однако, если вы хотите, чтобы строковые данные и строки не все были одинаковыми фиксированными размерами, вы не должны использовать массивы вообще. Вы должны, скорее всего, использование std::wstring:

std::vector<std::wstring> string_list; 


* Если я не ошибаюсь, он на самом деле является законным в соответствии с C++ 11 спецификации сказать std::vector<wchar_t[100]> v(100); потому что делать это в одиночку не устанавливает каких-либо требований по тип элемента, за исключением того, что он по умолчанию конструктивен, какие массивы. Однако выполнение большинства полезных данных с v требует больше от типа элемента, чем предоставляют массивы.

2

Вы не можете объявить векторы массивов в C++. Один из подходов состоит в том, чтобы поместить ваш массив внутри структуры, а затем использовать эту структуру внутри вашего вектора.

struct WCharArray 
{ 
    wchar_t a[SIZE]; 
}; 

vector<WCharArray> string_list(100); 
2

Вы не можете сделать vector массива, так как массивы, ну, странно.

У вас есть несколько вариантов вместо:

  1. Если ваши строки статичны вы можете использовать вектор указателей vector<wchar_t*>.
  2. Если вам действительно нужен вектор массивов, обернуть массив в структуры:
  3. При наличии, вы можете использовать array шаблон: vector< array<wchar_t, SIZE> >.

Вариант 2 будет выглядеть следующим образом:

struct WArray 
{ 
    wchar_t s[SIZE]; 
}; 
vector<WArray> string_list; 
+0

Массивы не могут быть назначены, что является требованием для типов в векторах. –