템플릿과 상속에 문제가 있습니다. 다음 코드를 고려하십시오.
#include <iostream>
using namespace std;
class TemplateBase {
public:
TemplateBase() {}
};
class TemplateA: public TemplateBase {
public:
TemplateA():TemplateBase() {}
};
template <class T>
class Base {
public:
Base() {}
};
class Derived: public Base<TemplateA> {
public:
Derived(): Base() {}
};
int main()
{
Base<TemplateBase>* a = new Base<TemplateBase>(); // ok
Base<TemplateA>* b = new Derived(); // ok
Base<TemplateBase>* c = new Derived(); // error: cannot convert ‘Derived*’ to ‘Base<TemplateBase>*’ in initialization
}
문제는 c
알려지지 않은 이유로 실패한 pointer 할당입니다 . 내가 지정하려고 Derived<AnotherDerived>
에를 Base<AnotherBase>
이 가능할까요?
도움을 주셔서 감사합니다.
당신은 Derived
에서 파생 된 비 템플릿 클래스입니다 Base<TemplateA>
. 라인에서
Base<TemplateBase>* c = new Derived();
에 Derived
대한 포인터를 통해 개체를 참조하려고 합니다 Base<TemplateBase>
. 컴파일러를 들어,이 사이에 아무 관계없는 Base<TemplateBase>
및 Derived
따라서 실패. 이용 가능한 유일한 기준은 Base<TemplateA>
이로부터 Derived
도출된다.
가능한 해결책은 다음 Derived
과 같은 템플릿을 만드는 것입니다.
template<typename T>
class Derived: public Base<T> {
public:
Derived(): Base<T>() {}
};
다음으로 사용
Base<TemplateBase>* c = new Derived<TemplateBase>;
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다