>백엔드 개발 >C++ >C의 템플릿 클래스 생성자에서 '정의되지 않은 참조' 오류가 발생하는 이유는 무엇입니까?

C의 템플릿 클래스 생성자에서 '정의되지 않은 참조' 오류가 발생하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-13 17:55:13933검색

Why Do I Get an

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

C 프로그래밍에서 템플릿 클래스는 다양한 유형으로 인스턴스화할 수 있는 일반 기능을 제공하는 데 사용되는 경우가 많습니다. 그러나 때로는 템플릿 클래스를 인스턴스화할 때 "정의되지 않은 참조 대상" 오류가 발생할 수 있습니다.

이 오류는 컴파일러가 템플릿 클래스의 생성자에 대한 구현을 찾을 수 없을 때 발생합니다. 일반적으로 컴파일러는 인스턴스화된 클래스에 대한 코드를 생성하기 위해 생성자의 구현을 확인해야 합니다.

문제

제공된 코드에서 템플릿 클래스 cola는 cola.h에 정의되어 있습니다. 헤더 파일이지만 구현은 cola.cpp 파일에 있습니다. 프로그램을 컴파일할 때 컴파일러는 main.cpp에서 템플릿 선언을 확인하고 float 및 string 유형을 사용하여 cola 클래스를 암시적으로 인스턴스화하려고 시도합니다.

그러나 컴파일러는 아직 main.cpp에서 생성자의 구현을 확인하지 못했습니다. cola.cpp에서는 이러한 인스턴스화된 클래스에 대한 코드를 생성할 수 없어 "정의되지 않은 참조"가 발생합니다. error.

해결책

이 문제를 해결하는 방법에는 두 가지가 있습니다.

접근 방법 1: 명시적 템플릿 인스턴스화

끝에 명시적 템플릿 인스턴스화 추가 cola.cpp 파일:

template class cola<float>;
template class cola<string>;

이것은 컴파일러에게 코드를 생성하도록 명시적으로 지시합니다. 지정된 유형의 콜라 템플릿 클래스에 대해.

접근 방법 2: 구현을 헤더 파일로 이동

템플릿 클래스 생성자 및 멤버 함수의 구현을 헤더 파일(cola.h 및 nodo_colaypila.h).

이렇게 하면 컴파일러가 템플릿 클래스를 인스턴스화할 때 구현을 볼 수 있으므로 명시적인 작업이 필요하지 않습니다. 인스턴스화.

헤더 파일 대 번역 단위

접근법 1에서는 명시적 인스턴스화가 번역 단위(단일 컴파일된 파일) 끝에서 수행됩니다. 즉, 해당 파일의 모든 코드는 인스턴스화 전에 컴파일되어야 합니다.

접근 방식 2에서 구현은 템플릿 클래스를 사용하는 모든 번역 단위에 포함된 헤더 파일에 있습니다. 결과적으로 컴파일 순서에 관계없이 컴파일러에서 구현을 사용할 수 있습니다.

결론

두 접근 방식 모두 템플릿 클래스의 "정의되지 않은 참조" 오류에 대한 유효한 솔루션입니다. 선택은 프로젝트의 특정 요구 사항에 따라 다릅니다. 명시적 인스턴스화는 더 유연하며 생성되는 템플릿 전문화를 더 잘 제어할 수 있습니다. 그러나 구현을 헤더 파일로 이동하는 것이 더 일반적이며 템플릿 클래스 사용에 더 많은 유연성을 제공합니다.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.