2013-09-12 4 views
3

Рассмотрим фрагмент кода:Почему я не могу нажать указатель const на std :: vector?

class T; 

void constructVector(const T* item) 
{ 
    std::vector<T*> v; 
    v.push_back(item); 
} 

Я получаю сообщение об ошибке с MSVC 2010 компилятором:

error: C2664: 'void std::vector<_Ty>::push_back(_Ty &&)' : cannot convert parameter 1 from 'const T *' to 'T *&&' with [ _Ty=T * ] Conversion loses qualifiers

Я могу видеть это особенности преобразования является незаконным, но я не верю, что мой код семантически неправильно. Я также считаю, что есть вариант push_back(const T&), почему это не соответствует моему звонку?

+1

У вас есть вектор, не являющихся предметов константных и вы нажимаете элемент const. Это говорит вам, что они не одно и то же. – Jay

+0

@Jay: О, я понимаю, что вы имеете в виду! Глупый вопрос. –

ответ

5

Потому что вектор неконстантных указателей. Он не будет преобразовывать указатель const в указатель, не являющийся константой. Это победит цель const.

Я считаю, что push_back (сопзЬ T &) не то, что вы ищете, потому что это делает Т объект сам константный, это не меняет типа Т с (*) до (const *).

Вы могли бы сделать вектор вектор константных указателей:

void constructVector(const T* item) 
{ 
    std::vector<const T*> v; 
    v.push_back(item); 
} 

Или вы могли бы изменить свою функцию, чтобы взять неконстантную указатель:

void constructVector(T* item) 
{ 
    std::vector<T*> v; 
    v.push_back(item); 
} 
0

падения const

недействительными constructVector ( Const Т * элемент);

или

Использование:

void constructVector(const T* item) 
{ 
    std::vector<const T*> v; 
    v.push_back(item); 
} 
+0

Очевидно, что 'const' - это пробка здесь, я просто не мог понять, почему до комментария Джей. –

Смежные вопросы