템플릿을 선언하는 구문은 template<class B>
(또는 이와 동등하게는 template<typename B>
)입니다.
Base
참조 MyOperation
(반환 유형 및 operate
함수 내부) 순환 참조가 있습니다. 따라서 Base
전에 MyOperation
을 정의해야합니다.
그러나 MyOperation
도 Base
(기본 클래스)을 참조하십시오.
기본 클래스 및 함수 내에서 사용하려면 전체 정의가 필요합니다. 그러나 반환 유형의 경우 유형이 불완전한이면 충분합니다. 그래서 MyOperation
처럼, Base
전에 미리 선언 될 필요가있다 :
template<class B> class MyOperation;
그리고 추가
는
operate()
MyOperation
의 정의 후,
class Base { ... }
의 외부 (선언되지 않음)을 정의 할 필요가있다. ,
// pre-declaration of MyOperation
template<class B> class MyOperation;
// definition of Base class
class Base {
public:
// declaration of Base::operate member function
// MyOperation<Base> is incomplete type here
MyOperation<Base> operate(Base x);
};
// definition of MyOperation class template
template<class B>
class MyOperation : public Base{
public:
B b;
MyOperation(B b_){ b = b_; }
};
// definition ofBase::operate member function
inline MyOperation<Base> Base::operate(Base x) {
return MyOperation<Base>(x);
}
Base::operate
이 정의는 헤더 파일에있는 경우 인라인 할 필요가 헤더가 여러 소스 파일이 포함 된 경우, 그렇지 않으면 여러 링커 기호가있을 것입니다 : 올바른 코드가 될 것이다.
인라인이 아닌 경우 (큰 기능인 경우 더 좋음) 정의는 소스 파일에 있어야합니다.
이'템플릿 (클래스 B)'이 올바른 구문입니까? – nbro
컴파일러에서 줄을 표시해야합니다. 일반적으로 오류가 구문을 언급하면 구문을 엉망으로 만든 것입니다. 여기에 'template (클래스 B)'가 있는데, 템플릿이'template '일 때입니다. 귀하의 의사 코드가 될 수도 있지만, 그렇지 않으면 대답을 게시합니다. –
TankorSmash
'Base'는'Base'에 정의되어 있기 때문에'MyOperation'을 볼 수 없습니다. –