2012-01-13 4 views
8

저는 C++ 초보자입니다. 오늘은 문제가있다 : 컴파일 할 때C++ 오류 : 멤버 선언을 찾을 수 없습니다.

template<class T> Ptr_to_const<T>& Ptr_to_const<T>::operator=(
     const Ptr_to_const<T> & p) { 
     ... 
    return *this; 
} 

는, 컴파일러는 항상 말한다 :

template<class T> class Ptr_to_const { 
private: 
    Array_Data<T>* ap; 
    unsigned sub; 

public: 
     ... 

    Ptr_to_const<T> & operator=(const Ptr_to_const<T> & p); 

}; 

및 소스 파일에

, 내가 같이 프로그램 ' 회원 헤더 파일 , 나는 클래스를 정의 선언을 찾을 수 없습니다 '. 왜?

나는 이클립스 CDT + Cygwin에서 GCC는

가 대단히 감사합니다 사용!

+1

AFAIK 원본 파일에 템플릿 클래스를 구현하면 안됩니다. 헤더에 함수의 정의를 설정하십시오. – Lucian

답변

6

템플릿 클래스는 헤더 또는 사용자가 포함하는 다른 파일에서 선언되고 정의되어야합니다. 그것들은 헤더에서 선언 될 수없고 평소와 같이 소스 파일에 정의 될 수 없습니다.

추론은 템플릿을 실제 유형 및 소스 유형으로 대체해야하며 컴파일러는 사용 가능한 모든 유형의 템플릿을 사전 컴파일 할 수 없으므로 사용자는 그것을 처리 할 수 ​​있어야합니다 (코드에 대한 액세스가 필요합니다).

여러 버전의 라이브러리가 동일한 템플릿을 포함하는 경우 여러 버전의 헤더에 대해 컴파일 될 수 있으므로 개체를 전달할 때 몇 가지 문제가 발생합니다 (One Definition Rule 참조).

0

당신은 헤더 파일 의 마지막에 소스 파일을 포함해야하거나 템플릿 클래스를

1

"을 (를) 찾을 수 없습니다 회원 선언"을 정의 할 때 헤더 파일에 멤버 함수를 정의 이클립스 정적 분석에 의해 생성 된 오류입니다 도구 (codan)가 필요합니다. 이 오류가 발생하지만 컴파일이 성공하면 오류가 발생합니다. 이 도구의 이전 버전은 약간의 오 탐률을 제공하는 것으로 알려져 있습니다 (예 : this bug report). Eclipse CDT를 최신 버전으로 업데이트하는 것이 좋습니다. 도움이되지 않으면 Eclipse CDT에 버그 보고서를 제출하십시오.

그러나 컴파일러에서도 오류가 발생하면 (문제보기의 유형 열에서 C/C++ 문제로 표시됨) 헤더 파일을 포함하지 않을 수도 있습니다.

관련 문제