2014-01-09 2 views
0

C++ новичок здесь. Я закончил делать проект, используя Bloodshed Dev C++, и теперь я хочу сделать его проектом Visual C++, потому что я хочу узнать, как использовать OpenGL в нем, и большинство учебников используют позже для демонстрации.Visual C++ не может скомпилировать векторную вставку()

Хотя незнаком с ним, я использовал vector управлять динамический массив указателей на объекты, которые привели меня к использованию insert() и erase(), не имея каких-либо знаний iterator с вообще, так что не быть резким с моим вопросом , Проблема заключается в том, что я вставляю новый элемент в вектор, используя вычисляемый int, чтобы указать позицию, которую нужно вставить (хотя я уверен, что это не то, что вызывает ошибку компилятора -> см. Конец сообщения). Линия (здесь и далее я заменил реальные имена с примерами):

vectorExample.insert(vectorExample.begin() + position, NULL);

Все компилируется и работает без каких-либо проблем в Dev C++ но в Visual C++, когда я пытаюсь скомпилировать эту строку Я получаю следующие ошибки (он компилирует без него и программа работает для всего остального):

1>c:\program files\microsoft visual studio 10.0\vc\include\xmemory(208): error C2440: 'initializing' : cannot convert from 'int' to 'ClassExample *' 
1>   Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast 
1>   c:\program files\microsoft visual studio 10.0\vc\include\xmemory(280) : see reference to function template instantiation 'void std::allocator<_Ty>::construct<int>(ClassExample **,_Other &&)' being compiled 
1>   with 
1>   [ 
1>    _Ty=ClassExample *, 
1>    _Other=int 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\vector(668) : see reference to function template instantiation 'void std::_Cons_val<std::allocator<_Ty>,ClassExample*,int>(_Alloc &,_Ty1 *,_Ty2 &&)' being compiled 
1>   with 
1>   [ 
1>    _Ty=ClassExample *, 
1>    _Alloc=std::allocator<ClassExample *>, 
1>    _Ty1=ClassExample *, 
1>    _Ty2=int 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\vector(688) : see reference to function template instantiation 'void std::vector<_Ty>::emplace_back<int>(_Valty &&)' being compiled 
1>   with 
1>   [ 
1>    _Ty=ClassExample *, 
1>    _Valty=int 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\vector(675) : see reference to function template instantiation 'std::_Vector_iterator<_Myvec> std::vector<_Ty>::emplace<int>(std::_Vector_const_iterator<_Myvec>,_Valty &&)' being compiled 
1>   with 
1>   [ 
1>    _Myvec=std::_Vector_val<ClassExample *,std::allocator<ClassExample *>>, 
1>    _Ty=ClassExample *, 
1>    _Valty=int 
1>   ] 
1>   c:\users\user\desktop\mycppproject\mycppfile.cpp(412) : see reference to function template instantiation 'std::_Vector_iterator<_Myvec> std::vector<_Ty>::insert<int>(std::_Vector_const_iterator<_Myvec>,_Valty &&)' being compiled 
1>   with 
1>   [ 
1>    _Myvec=std::_Vector_val<ClassExample *,std::allocator<ClassExample *>>, 
1>    _Ty=ClassExample *, 
1>    _Valty=int 
1>   ] 

Я смотрел на примеры и поиск в течение двух дней подряд, и я не могу найти ничего похожего на мою проблему. Я также попытался:

vectorExample.insert(vectorExample.begin(), NULL);

, но я все еще получаю те же самые ошибки. Я делаю что-то неправильно?

+1

Это см ms, вы не можете просто перевернуть NULL вместо указателя NULL. Просто гадать. – BWG

+0

Черт, да, на самом деле это указатель. Я просто инициализировал ClassExample * ptr = NULL; перед линией и сделал ее в vectorExample.insert (vectorExample.begin() + position, ptr); и он работал/facepalm – Devez

+0

Рад, что я мог бы помочь! – BWG

ответ

1

Попробуйте использовать

vectorExample.insert(vectorExample.begin() + position, nullptr); 

В C++ NULL определяется как 0. Таким образом, функция шаблон не может преобразовать ИНТ в указатель.

+0

Я предполагаю, что в ретроспективе это будет лучше, чем я предложил. – BWG

+0

@BWG Я не уверен, потому что не все компиляторы поддерживают nullptr. –

+0

Он поддерживается только в C++ 11, который еще не поддерживается всеми компиляторами. –

1

Я сделаю снимок.

Если вы изучаете определение NULL, то это всего лишь 0 или 0L. Однако ваш вектор принимает тип ClassExample *. Хотя указатель по существу является int, вы не можете просто ввести int. И NULL - это только то, что int.

Чтобы исправить это, я полагаю, вы могли бы сделать что-то вроде:

ClassExample* p = NULL; //assigning a pointer to NULL (0) is alright 
vectorExample.insert(vectorExample.begin() + position, p); 
1

NULL является определить, что карты 0.Компилятор говорит вам, что он не может неявно преобразовать целое число в указатель:

Преобразование из интегрального типа к типу указателя требуется reinterpret_cast, C-стиль литые или функции в стиле литой

Так делать то, что компилятор говорит вам:

vectorExample.insert(vectorExample.begin() + position, reinterpret_cast<ClassExample*>(NULL)); 

Или:

vectorExample.insert(vectorExample.begin() + position, (ClassExample*)NULL); 
Смежные вопросы