4 votes

Pourquoi ne puis-je pas pousser un pointeur constant vers std::vector ?

Considérez le morceau de code :

class T;

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

Je reçois une erreur avec le compilateur MSVC 2010 :

erreur : C2664 : 'void std::vector<_Ty>::push_back(_Ty &&)' : impossible de convertir le paramètre 1 de 'const T *' en 'T *&&' avec [ _Ty=T * ] La conversion perd les qualificatifs

Je peux voir que cette conversion particulière est illégale, mais je ne crois pas que mon code soit sémantiquement mauvais. Je crois aussi qu'il y a push_back(const T&) variante, pourquoi ça ne correspond pas à mon appel ?

9voto

apLundell Points 101

Parce que c'est un vecteur de pointeurs non-constants. Il ne convertira pas un pointeur constant en un pointeur non constant. Cela irait à l'encontre de l'objectif de const.

Je pense que le push_back(const T&) n'est pas ce que vous recherchez, car cela rend l'objet T lui-même const, il ne change pas la type de T de (*) à (const *).

Vous pourriez faire du vecteur un vecteur de pointeurs const :

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

Ou vous pouvez modifier votre fonction pour qu'elle prenne un pointeur non-const :

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

1voto

P0W Points 21239

Drop const

void constructVector( const T* item) ;

ou

Utilisez :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X