2011-05-07 5 views
4

프레임 워크를 작성할 때 다음과 같은 문제가 발생했습니다. 나는 이고 class Bclass 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에 의해 알려지지 않은 것을 처리하는 방법을 알지 못합니다. 앞으로 선언문을 쓸 수 있습니까? 아니면 다른 뭔가가 필요합니까?

예, 템플릿 검색에 대한 게시물이 많이 있지만 개인적인 문제를 해결할 수 없습니다. 그것은 나를 위해 조금 복잡하다.

도움 주셔서 감사합니다.

답변

9

전달 선언이 잘못되었습니다. 다음과 같아야합니다.

template <class Number> 
class B; 
    ^no argument list 
+0

감사 :이 간단한 예에서 작동합니다. 하지만 아직도 내 프레임 워크에서 작동하지 않는 이유가 궁금합니다. 이유를 검색하면 쓰겠습니다. – leuays

+0

그래, 내가 뭘 잘못했는지 알아. 컴파일러가 "_B is not template_"대신 "_B template_ type is_"이 아닌 디스플레이를 시작했다. 그것은 주된 문제였습니다. 그것은 하나의 파일에'class B' 선언 (템플릿을 사용하기 위해 리메이크하는 것을 잊어 버린 오래된 파일)이 있었기 때문입니다. 그래서'template B' (컴파일러는 "untemplatized"B를 알고 새로운 선언을하지 못하게했습니다) 선언 할 수 없었습니다. 그리고 그것 때문에 매개 변수 목록이없는 선언이 잘못되었다고 생각했지만 정확합니다. 다시 한번 감사드립니다 :). – leuays