سؤال

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

لا أفهم لماذا يتجمع هذا (ربما يمكن لشخص ما تقديم تفسير مفصل؟ هل هو شيء مرتبط بالبحث عن الاسم؟

راجع للشغل ، على Solaris ، Sunstudio12 لا يجمع: 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*>

هل كانت مفيدة؟

المحلول

std::pair لديه قالب مُنشئ:

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

"التأثيرات: تهيئة الأعضاء من الأعضاء المقابلة في الوسيطة ، وإجراء تحويلات ضمنية حسب الحاجة." (C ++ 03 ، 20.2.2/4)

التحويل من مؤشر الطبقة المشتقة إلى مؤشر الطبقة الأساسية ضمني.

نصائح أخرى

نظرًا لأن B مستمدة من A ، فإن المتجه V سيحتوي على مؤشرات إلى الهياكل الفئة الأساسية للكائن B. لذلك ، يمكنك الوصول إلى أعضاء A ، أي

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

تحرير: خطأي ، كما هو موضح أدناه ، لا يزال بإمكانك الإلقاء على مؤشرات من النوع B نظرًا لأن المتجه من مؤشرات ، وليس كائنات ، لذلك لم يحدث أي تقطيع كائن.

مكالمة مثل

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

لن يتم تجميعها لأن العناصر الموجودة في المتجه هي مؤشرات فئة أساسية ولا يمكن أن تشير إلى أعضاء الفصل المشتقون بدون طاقم ، أي

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

لاحظ أيضًا أن يلقي ديناميكيًا ، كما في

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

لن يتم تجميعها مع الخطأ التالي في مجلس التعاون الخليجي:

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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top