Question

#include <vector>

struct A {int a;};
struct B : public A {char b;};

int main()
{
  B b;
  typedef std::pair<A*, A*> MyPair;
  std::vector<MyPair> v;
  v.push_back(std::make_pair(&b, &b)); //compiler error should be here(pair<B*,B*>)
  return 0;
}

Je ne comprends pas pourquoi cette compile (peut-être quelqu'un peut bien vouloir fournir des explications détaillées? Est-il quelque chose lié au nom consultation?

BTW, sur Solaris, SunStudio12 il ne compile pas: error : formal argument x of type const std::pair<A*, A*> & in call to std::vector<std::pair<A*,A*> >::push_back(const std::pair<A*, A*> & ) is being passed std::pair<B*, B*>

Était-ce utile?

La solution

std::pair a un modèle constructeur:

template<class U, class V> pair(const pair<U, V> &p);
  

« Effets: Initialise membres des membres correspondants de l'argument, effectuer des conversions implicites au besoin. » (C ++ 03, 20.2.2 / 4)

Conversion à partir d'un pointeur de classe dérivée d'un pointeur de classe de base est implicite.

Autres conseils

Parce que B est dérivé d'A, le vecteur v contient des pointeurs vers des structures de classes de base de l'objet b. Par conséquent, vous pouvez accéder aux membres de A, i.e..

std::cout << v[0].first->a;

EDIT: Mon erreur, comme indiqué ci-dessous, vous pouvez toujours jeter des pointeurs de type B puisque le vecteur est de pointeurs, pas des objets, donc pas de découpage en tranches d'objet a eu lieu.

Un appel comme

std::cout << v[0].first->b; 

ne compilera pas puisque les éléments du vecteur sont des pointeurs de classe de base et ne peuvent pointer vers les membres de la classe dérivée sans fonte, i.e..

 std::cout << static_cast<B*>(v[0].first)->b; 

Notez également que un casting dynamique, comme dans

std::cout << dynamic_cast<B*>(v[0].first)->b;  

ne compilera pas avec l'erreur suivante dans gcc:

cast.cpp:14: error: cannot dynamic_cast ‘v.std::vector<_Tp, _Alloc>::operator[] [with _Tp = std::pair<A*, A*>, _Alloc = std::allocator<std::pair<A*, A*> >](0u)->std::pair<A*, A*>::first’ (of type struct A*’) to type struct B*’ (source type is not polymorphic)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top