2012-06-09 7 views
2

Я столкнулся с ошибкой компиляции при попытке инициализировать вектор указателей на NULL с помощью конструктора std::vector. Я упростить инструкцию, чтобы держать его просто:Инициализировать вектор указателей (автоматически)

vector<int*> v (100,NULL) 

Я предполагаю, что это что-то делать с несовместимостью const T& value= T() (параметр конструктора) и значение NULL самого, но я был бы признателен за дальнейшие объяснения.

Спасибо

+1

«Ошибка выполнения»? Какая ошибка? Вы запустили это в отладчике, чтобы подтвердить, что это была строка, которая не срабатывала? –

+0

Нет, я не использовал отладчик (я вроде новичок). Кроме того, это не исполнение, а ошибка компиляции, я ошибся. Здесь вы найдете: ArbreN.hpp: 55: 3: warning: передача NULL в аргумент non-pointer 2 из 'std :: vector <_Tp, _Alloc> :: vector (_InputIterator, _InputIterator, const allocator_type &) [с _InputIterator = int, _Tp = ArbreNari :: node_arbreNari *, _Alloc = std :: allocator :: node_arbreNari *>, std :: vector <_Tp, _Alloc> :: allocator_type = std :: allocator :: node_arbreNari *>] '[-Wconversion- null] –

+4

Кстати, если вы используете конструктор с одним аргументом ('vector v (100);', они будут автоматически инициализированы на 'NULL'. –

ответ

0

NULL, вероятно, определяется как 0, так что вы в конечном итоге с

vector<int*> v(100,0); 

, который пытается построить вектор int с, не int* с.

Просто пропустите NULL, поскольку это по умолчанию для указателей в любом случае, или приведёте его к правильному типу указателя (int*)NULL.

+1

Я предполагаю, что он скорее пытается использовать перегрузку конструктора с двумя итераторами ввода (путем разрешения ввода типа итератора на 'int'). Это не просто волшебным образом пытается создать вектор 'int', это все равно 'std :: vector ' конструктор, который вызывается. –

+0

Ну, это мой взгляд на это.:-) Основная проблема заключается в том, что NULL является 0, что делает вызов конструктора похожим на 'vector (int, int)'. Это * будет * работать для вектора '. –

5

Если вы имеете соответствующую поддержку C++ 11, вы можете использовать nullptr:

std::vector<int*> v(100, nullptr); 

Однако, в вашем конкретном случае, нет необходимости указывать значение по умолчанию, так что следующий будет достаточно:

std::vector<int*> v(100); 
Смежные вопросы