Domanda

#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;
}

Non capisco perché questo compila (forse qualcuno può gentilmente fornire spiegazione dettagliata? E 'qualcosa legato al nome di look-up?

A proposito, su Solaris, SunStudio12 non si compila: 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*>

È stato utile?

Soluzione

std::pair ha un modello di costruttore:

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

"Effetti: Inizializza membri dai corrispondenti componenti del ragionamento, eseguendo conversioni implicite come necessario." (C ++ 03, 20.2.2 / 4)

La conversione da un puntatore classe derivata a un puntatore alla classe base è implicita.

Altri suggerimenti

Poiché B è derivato da A, il vettore v conterrà puntatori a strutture di classe di base dell'oggetto b. Pertanto, è possibile accedere ai membri di A, cioè.

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

EDIT: Il mio errore, come sottolineato di seguito, è ancora possibile lanciare ai puntatori di tipo B dal momento che il vettore è di puntatori, non gli oggetti, quindi si è verificato alcun affettare oggetto.

Una chiamata come ad esempio

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

non verrà compilato in quanto gli elementi nel vettore sono puntatori alla classe base e non possono indicare i membri della classe derivate senza getto, cioè.

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

Si noti inoltre che un cast dinamico, come in

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

non verrà compilato con il seguente errore in 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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top