> 백엔드 개발 > C++ > 템플릿 클래스 생성자에 대해 '정의되지 않은 참조' 오류가 발생하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

템플릿 클래스 생성자에 대해 '정의되지 않은 참조' 오류가 발생하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

Susan Sarandon
풀어 주다: 2024-12-12 19:58:10
원래의
732명이 탐색했습니다.

Why Do I Get

템플릿 클래스 생성자에 대한 "정의되지 않은 참조" [중복]

템플릿 클래스 생성자에 대한 컴파일러 오류 "...에 대한 정의되지 않은 참조"는 명시적인 인스턴스화가 부족함을 나타냅니다. 프로그램에 사용되는 특정 템플릿 클래스에 대한 지침입니다. 이 문제는 명시적으로 필요할 때까지 컴파일러가 템플릿 코드를 자동으로 컴파일하지 않기 때문에 발생합니다.

해결책 1: 명시적 템플릿 인스턴스화

구현 파일 끝에 명시적 템플릿 인스턴스화 문을 추가합니다(콜라 .cpp):

template class cola<float>;
template class cola<string>;
로그인 후 복사

추가로 다음 줄을 포함하세요. nodo_colaypila.cpp:

template class nodo_colaypila<float>;
template class nodo_colaypila<std::string>;
로그인 후 복사

이렇게 하면 컴파일러가 필수 템플릿 클래스를 컴파일하게 됩니다.

해결책 2: 헤더 파일에 구현 포함

cola에서 구현 코드 이동 .cpp 및 nodo_colaypila.cpp를 각각 cola.h 및 nodo_colaypila.h로 변환합니다. 이렇게 하면 템플릿 클래스를 사용하는 모든 번역 단위에서 기능 정의의 가용성이 보장됩니다.

각 솔루션의 장단점:

  • 솔루션 1:

    • Pro: 필요한 템플릿만 컴파일하므로 더욱 효율적입니다. 인스턴스.
    • 단점: 원하는 각 템플릿 클래스에 대해 수동 인스턴스화가 필요합니다.
  • 해결책 2:

    • Pro: 향후 템플릿 수업이 가능해 더욱 편리하고 유연해집니다. 인스턴스화.
    • 단점: 각 번역 단위에 대한 중복 코드 생성으로 인해 잠재적으로 컴파일 속도가 느려질 수 있습니다.

코드의 기타 오타:

  • cola.h의 포인터 구문이 일치하지 않습니다. 선언:
nodo_colaypila<T><T>* ult, pri;
로그인 후 복사

다음과 같아야 합니다.

nodo_colaypila<T>* ult, *pri;
로그인 후 복사
  • nodo_colaypila.h 끝에 #endif가 누락되었습니다.
  • nodo_colaypila의 기본 매개변수 생성자는 구현이 아닌 헤더 파일에 정의되어야 합니다. 파일입니다.

위 내용은 템플릿 클래스 생성자에 대해 '정의되지 않은 참조' 오류가 발생하는 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿