2016-05-10 3 views
2

Три простых оператора, один не компилируется.std :: vector, почему список инициализаторов не работает в C++/CLI

std::vector<size_t>({}); 
std::vector<size_t>({ 1 }); // This does not compile 
std::vector<size_t>({ 1, 2 }); 

Только второе утверждение с одним элементом в списке вызывает ошибку:

cannot convert from 'initializer-list' to 'std::vector<size_t,std::allocator<char32_t>>' 

Он отлично работает для char, long, int и т.д., но не для size_t. Кто-нибудь знает, почему и, возможно, есть обходной путь?

Вот полный код:

// ConsoleApplication1.cpp : main project file. 

#include "stdafx.h" 
#include <vector> 

using namespace System; 

int main(array<System::String ^> ^args) 
{ 
    std::vector<size_t>({}); 
    std::vector<size_t>({ 1 }); 
    std::vector<size_t>({ 1, 2 }); 
    return 0; 
} 

Я использую ++/CLI компилятор C от VS2013

+2

[Works fo] (http://coliru.stacked-crooked.com/a/b360341326a33bcf) [r me] (http: //coliru.stacked -crooked.com/a/a9fb491f977996f3). Где ваш [MCVE]? –

+3

Работает с C++ 11. – Klaus

+0

Почему вы используете аргумент size_t как шаблон? Не могли бы вы использовать int или long? – sergiol

ответ

1

Право и надлежащим образом использовать зЬй :: инициализатор-список

std::vector<size_t>{}; 
    std::vector<size_t>{ 1 }; 
    std::vector<size_t>{ 1, 2 }; 

Т.е. Без круглых скобок. См. Примеры http://www.stroustrup.com/C++11FAQ.html#init-list.

Использование этого должно исправить вашу проблему. В противном случае, в крайнем случае, вы можете принудительно ввести такой тип: std::vector<size_t>(std::initializer-list<size_t>{ 1 });