programing tip

템플릿을 사용할 때 "해결되지 않은 외부 기호"오류가 발생하는 이유는 무엇입니까?

itbloger 2020. 9. 6. 08:50
반응형

템플릿을 사용할 때 "해결되지 않은 외부 기호"오류가 발생하는 이유는 무엇입니까? [복제]


이 질문에 이미 답변이 있습니다.

템플릿을 사용하여 클래스에 대한 C ++ 코드를 작성하고 소스 (CPP) 파일과 헤더 (H) 파일간에 코드를 분할 할 때 최종 실행 파일을 연결할 때 "해결되지 않은 외부 기호"오류가 많이 발생합니다. 오브젝트 파일이 올바르게 빌드되고 링크에 포함 되었음에도 불구하고. 여기서 무슨 일이 일어나고 있으며 어떻게 해결할 수 있습니까?


템플릿 클래스와 함수는 일반적으로 별도의 .cpp 파일 (예 : 프로그램 소스)에서 사용될 때까지 인스턴스화되지 않습니다. 템플릿을 사용할 때 컴파일러는 적절한 유형으로 올바른 함수를 빌드 할 수 있도록 해당 함수에 대한 전체 코드가 필요합니다. 그러나이 경우 해당 함수의 코드는 템플릿의 소스 파일에 자세히 나와 있으므로 사용할 수 없습니다.

이 모든 결과로 컴파일러는 다른 곳에 정의되어 있다고 가정하고 템플릿 함수에 대한 호출 만 삽입합니다. 템플릿의 소스 파일을 컴파일 할 때 프로그램 소스에서 사용되는 특정 템플릿 유형이 여기에서 사용되지 않으므로 함수에 필요한 코드를 생성하지 않습니다. 이로 인해 해결되지 않은 외부 기호가 생성됩니다.

이를 위해 사용할 수있는 솔루션은 다음과 같습니다.

  1. 템플릿의 헤더 파일에 멤버 함수의 전체 정의를 포함하고 템플릿에 대한 소스 파일이 없습니다.
  2. 템플릿의 소스 파일에있는 모든 멤버 함수를 "인라인"으로 정의하거나
  3. "export"키워드를 사용하여 템플릿의 소스에서 멤버 함수를 정의합니다. 불행히도 이것은 많은 컴파일러에서 지원되지 않습니다. (업데이트 : C ++ 11 기준으로 표준에서 제거되었습니다 .)

1과 2 모두 기본적으로 프로그램 소스에서 형식화 된 함수를 빌드하려고 할 때 템플릿 함수의 전체 코드에 대한 컴파일러 액세스를 제공하여 문제를 해결합니다.


또 다른 옵션은 코드를 cpp 파일에 넣고 동일한 cpp 파일에 사용할 것으로 예상되는 유형으로 템플릿의 명시 적 인스턴스화를 추가하는 것입니다. 이것은 미리 알고있는 몇 가지 유형에만 사용할 것이라는 것을 알고있는 경우에 유용합니다.


.h 파일을 포함하는 각 파일에 대해 두 줄을 모두 삽입해야합니다.

#include "MyfileWithTemplatesDeclaration.h"
#include "MyfileWithTemplatesDefinition.cpp"

견본

#include "list.h"
    #include "list.cpp" //<---for to fix bug link err 2019



    int main(int argc, _TCHAR* argv[])
    {
        list<int> my_list;
        my_list.add_end(3);
    .
    .
    } 

또한 센티넬 상수 사이에 선언 클래스를 배치하는 것을 잊지 마십시오.

#ifndef LIST_H
#define LIST_H
#include <iostream>
.
.
template <class T>
class list
{
private:
    int m_size,
        m_count_nodes;
    T m_line;
    node<T> *m_head;
public:
    list(void);
    ~list(void);
    void add_end(T);
    void print();
};
#endif

참고 URL : https://stackoverflow.com/questions/456713/why-do-i-get-unresolved-external-symbol-errors-when-using-templates

반응형