2016-09-01 1 views
-3

C++ 템플릿의 작동 방식을 이해하기 위해 약간의 프로젝트를 진행하고 있습니다. (';' '<'전에 오류 C2143 누락) 내 프로그램을 컴파일 할 때C++ 클래스 템플릿을 함수 반환 형식으로 사용합니다.

class Base{ 
public: 
    MyOperation<Base> operate(Base x){ return MyOperation<Base>(x); } //error here 
}; 

//... 

template<class B> 
class MyOperation : public Base{ 
public: 
    B b; 
    MyOperation(B b_){ b = b_; } 
}; 

, 나는 오류가 발생 : 는 기본적으로, 내가 좋아하는 뭔가가있다. MyOperation을 funcion의 반환 유형으로 사용할 수 없기 때문입니까()?

미리 감사드립니다.

+4

이'템플릿 (클래스 B)'이 올바른 구문입니까? – nbro

+0

컴파일러에서 줄을 표시해야합니다. 일반적으로 오류가 구문을 언급하면 ​​구문을 엉망으로 만든 것입니다. 여기에 'template (클래스 B)'가 있는데, 템플릿이'template '일 때입니다. 귀하의 의사 코드가 될 수도 있지만, 그렇지 않으면 대답을 게시합니다. – TankorSmash

+1

'Base'는'Base'에 정의되어 있기 때문에'MyOperation'을 볼 수 없습니다. –

답변

3

템플릿을 선언하는 구문은 template<class B> (또는 이와 동등하게는 template<typename B>)입니다.

Base 참조 MyOperation (반환 유형 및 operate 함수 내부) 순환 참조가 있습니다. 따라서 Base 전에 MyOperation을 정의해야합니다.

그러나 MyOperationBase (기본 클래스)을 참조하십시오.

기본 클래스 및 함수 내에서 사용하려면 전체 정의가 필요합니다. 그러나 반환 유형의 경우 유형이 불완전한이면 충분합니다. 그래서 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이 정의는 헤더 파일에있는 경우 인라인 할 필요가 헤더가 여러 소스 파일이 포함 된 경우, 그렇지 않으면 여러 링커 기호가있을 것입니다 : 올바른 코드가 될 것이다.

인라인이 아닌 경우 (큰 기능인 경우 더 좋음) 정의는 소스 파일에 있어야합니다.

+0

고맙습니다. 프로그래밍에 익숙하지 않아 순환 참조에 대해 생각하지 않았습니다. – user2440822

관련 문제