4
프레임 워크를 작성할 때 다음과 같은 문제가 발생했습니다. 나는 이고 class B
은 class A
에서 파생되었습니다.전달 선언 : 템플릿 및 상속
class A
에는 B*
을 반환하는 함수가 있습니다. 물론
, 그것은 어렵지 않다 :
#include <iostream>
using namespace std;
class B; // forward declaration
class A
{
public:
B* ReturnSomeData();
};
class B : public A
{
};
// Implementation:
B* A::ReturnSomeData()
{
return new B; // doesn't matter how the function makes pointer
}
int main()
{
A sth;
cout << sth.ReturnSomeData(); // print adress
}
그러나 내가 여기에 같은 템플릿을 사용했다 : 코드에서
이
#include <iostream>
using namespace std;
// This "forward declaration":
template <class Number>
class B<Number>;
// cannot be compiled:
// "7 error: 'B' is not a template"
template <class Number>
class A
{
public:
B<Number>* ReturnSomeData();
};
template <class Number>
class B : public A<Number>
{
};
// Implementation:
template <class Number>
B<Number>* A<Number>::ReturnSomeData()
{
return new B<Number>;
}
int main()
{
A<int> sth;
cout << sth.ReturnSomeData();
}
봐. 알 수 있듯이 A에 의해 알려지지 않은 것을 처리하는 방법을 알지 못합니다. 앞으로 선언문을 쓸 수 있습니까? 아니면 다른 뭔가가 필요합니까?
예, 템플릿 검색에 대한 게시물이 많이 있지만 개인적인 문제를 해결할 수 없습니다. 그것은 나를 위해 조금 복잡하다.
도움 주셔서 감사합니다.
감사 :이 간단한 예에서 작동합니다. 하지만 아직도 내 프레임 워크에서 작동하지 않는 이유가 궁금합니다. 이유를 검색하면 쓰겠습니다. – leuays
그래, 내가 뭘 잘못했는지 알아. 컴파일러가 "_B is not template_"대신 "_B template_ type is_"이 아닌 디스플레이를 시작했다. 그것은 주된 문제였습니다. 그것은 하나의 파일에'class B' 선언 (템플릿을 사용하기 위해 리메이크하는 것을 잊어 버린 오래된 파일)이 있었기 때문입니다. 그래서'template B' (컴파일러는 "untemplatized"B를 알고 새로운 선언을하지 못하게했습니다) 선언 할 수 없었습니다. 그리고 그것 때문에 매개 변수 목록이없는 선언이 잘못되었다고 생각했지만 정확합니다. 다시 한번 감사드립니다 :). –
leuays