Ошибка компиляции инициализатора массива C ++ / CLI - PullRequest
6 голосов
/ 12 марта 2011

Может кто-нибудь объяснить, почему следующий код не скомпилируется (странно отформатирован, чтобы легче было увидеть проблему):

ListView ^ listview = gcnew ListView();
listview->Items->AddRange( gcnew array<ListViewItem^> { 
    gcnew ListViewItem( gcnew array<String^> { L"red", L"fish" } ), 
    gcnew ListViewItem( gcnew array<String^> { L"green", L"eggs" } ) 
});

Это дает ошибку компиляции

ошибка C2440: «инициализация»: невозможно преобразовать из «const wchar_t [4]» в «System :: Windows :: Forms :: ListViewItem ^»

Если код разбит на две строки следующим образом, то все хорошо:

ListView^ listview = gcnew ListView();
ListViewItem^ lvi1 = gcnew ListViewItem( gcnew array<String^> { L"red", L"fish" } );
ListViewItem^ lvi2 = gcnew ListViewItem( gcnew array<String^> { L"green", L"eggs" } );
listview->Items->AddRange( gcnew array<ListViewItem^> { 
    lvi1, 
    lvi2 
});

Не обращая внимания на то, почему кто-то хочет создать монолитную однострочную строку для заполнения ListView, почему у компилятора возникают проблемы с инсталяцией ListViewItems в исходный код и как будет написан такой однострочный элемент?

1 Ответ

4 голосов
/ 12 марта 2011

Это громко крякает, как ошибка парсера компилятора.Будет немного интереснее, если вы оставите инициализатор строкового массива пустым.Затем вы получите это описание в окне «Вывод»:

1>c:\projects\cpptemp26\Form1.h(77) : error C2552: '$S4' : non-aggregates cannot be initialized with initializer list
1>        'System::Windows::Forms::ListViewItem ^' is not an array or class : Types which are not array or class types are not aggregate
1>c:\projects\cpptemp26\Form1.h(78) : error C2440: 'initializing' : cannot convert from 'const wchar_t [6]' to 'System::Windows::Forms::ListViewItem ^'
1>        Reason: cannot convert from 'const wchar_t *' to 'System::Windows::Forms::ListViewItem ^'
1>        No user-defined-conversion operator available, or
1>        Cannot convert an unmanaged type to a managed type

Обратите внимание на сообщение «ListViemItem ^ не массив или класс».Это настоятельно предполагает, что компилятор применяет инициализатор к ListViewItem вместо строкового массива, это чепуха.Он взрывается оттуда.

Это не будет исправлено в ближайшее время, если вообще будет.Вы знаете неопрятный обходной путь.Вы можете опубликовать на connect.microsoft.com для второго мнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...