سؤال

لدي تصميم مثل هذا:

template <class T>
class A
{
};

template <class T>
class B : public A<T> 
{
};

template <class T>
class C : public A<T> 
{
};

template <class T>
class D : public C<T>, public B<T> 
{
};

struct TConcrete {
int xyz;
};

class Concrete : public D<TConcrete>
{
void Foo();
};

void
Concrete::Foo()
{
Bar (boost::bind(&A::Afunc, this, _1, _2), boost::bind(&C::Cfunc, this, _1, _2),     boost::bind(&D::Dfunc, this, _1, _2));
}

يشكو المترجم من المكالمة الأولى :: ربط. لا توجد مشاكل في الداخل إلى C و D أي مشاكل. هذا هو الخطأ الدقيق:

Boost/bind/mem_fn_template.hpp (384): خطأ C2594: 'NewLine': تحويلات غامضة من 'concrete *' إلى 'a *' مع [t = tconcrete

أي أفكار ما الذي يمكن أن يكون خطأ في هذا؟

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

المحلول

يبدو مخطط الميراث الخاص بك شيئًا كهذا:

           Concrete 
              |
              D
             / \
            C   B
           /     \
          A       A

عندما تحاول تحويل الخاص بك Concrete* إلى A*, ، المترجم ليس لديه فكرة عن مثال A انت تريد. هل تريد التحويل إلى A الذي - التي C مشتق من ، أو A الذي - التي B مشتق من؟

الحل هو استخدام الميراث الافتراضي للاشتقاق B و C من A, ، بحيث لا يوجد سوى حالة واحدة من A.

           Concrete 
              |
              D
             / \
            C   B
             \ /
              A
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top