문제

나는 다음과 같은 디자인을 가지고 있습니다.

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': [t = tconcrete]를 사용하여 '콘크리트 *'에서 'a *'로 모호한 변환

이것에 무엇이 잘못 될 수 있는지 아이디어가 있습니까?

도움이 되었습니까?

해결책

상속 다이어그램은 다음과 같습니다.

           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