2011-02-18 6 views
0
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall MyList<class Event>::~MyList<class Event>(void)" ([email protected]@@@@[email protected]) referenced in function _main 

어떤 문제 일 수 있습니까? 전에 작업 클래스가 있었고 템플릿을 만들려고했는데 위의 오류가 발생했습니다. 어떤 생각? 나는 조금 길다.오류 코드 컴파일 템플릿을 템플릿으로 변환 한 후

MyList<Event> eventManager; 
+0

원본 클래스 코드와 템플릿 코드를 알려주십시오. –

답변

2

템플릿이 실행 코드가 아니기 때문에 이상하게도 C++의 컴파일 모델에서 재생됩니다. 템플릿은 실행 코드입니다. 따라서 클래스를 .h/.cpp 쌍으로 분할하는 표준 모델은 템플릿에서 올바르게 작동하지 않습니다.

일반적으로 인터페이스와 .cpp 파일을 사용하여 클래스를 .h 파일로 분해하는 이유는 일반적으로 .cpp 파일을 다른 .cpp 파일에 정의 된 코드를 참조하면서 별도로 컴파일 할 수 있기 때문입니다. 링커는 파일을 컴파일 한 후 모든 참조를 함께 패치합니다. 모든 .cpp는 실행 가능 코드가 포함 된 개체 파일로 컴파일되기 때문에 모든 것이 올바르게 작동합니다.

그러나 템플릿을 사용하면이 시스템이 고장납니다. 템플릿 클래스를 정의한 다음 멤버 함수의 모든 구현을 .cpp 파일에 넣으면 컴파일러에서 해당 파일을 컴파일 할 때 어떤 코드도 찾지 못합니다. 단지 템플릿의 경우 템플릿이므로 템플릿 메소드에 대한 객체 코드를 생성합니다. 따라서 링크 타임에는 사용 가능한 코드가 없기 때문에 템플릿 클래스에서 호출하려고 시도한 모든 멤버 함수에 대해 오류가 발생합니다.

이것이 특정 오류의 원인인지 알 수는 없지만 특히 템플릿이 아닌 클래스를 변경 한 경우 (예 :. h/.cpp 쌍)을 템플릿 클래스에 추가합니다.

이 문제를 해결하려면 기존 C++ 솔루션은 소스 파일을 첨부하지 않고 템플릿에 .h 파일을 저장하는 것입니다. 소스 파일의 모든 코드를 헤더로 이동하면됩니다. 인터페이스가 중지 및 구현이 조금 더 명확 점을하려면

/* * * * * Implementation Below This Point * * * * */ 

또는

/* * * * * Here be Dragons * * * * */ 

같은 자주 뭔가를 시작 어디 표시 헤더에 라인을 넣어 것을 좋아합니다.

희망이 도움이됩니다.

0

당신이 가장 가능성이 .cpp 파일에 (이 경우, 소멸자) 함수의 구현을 넣어 :

그리고 주에서

난이 사용. 그것은 작동하지 않습니다. 템플릿을 사용할 때 전체 함수 본문은 호출하는 모든 사용자가 액세스 할 수 있어야하므로 일반적으로 .h 파일에 저장됩니다.

관련 문제