C++ 코드를 작성할 때 "로컬 유형은 템플릿 매개변수로 허용되지 않습니다"와 같은 컴파일 오류가 발생하는 경우가 있습니다. 이는 일반적으로 함수 내부에 정의된 클래스 또는 구조체 유형과 같은 템플릿 매개변수에 로컬 유형을 사용하고 있음을 의미합니다. 이번 글에서는 이 문제와 해결 방법에 대해 알아보겠습니다.
먼저 이러한 컴파일 오류가 발생하는 이유를 살펴보겠습니다. C++에서는 템플릿 매개변수가 컴파일 타임에 확인되어야 하는 반면, 로컬 형식 정의는 런타임에 발생합니다. 따라서 로컬 유형은 컴파일러가 구문 분석 방법을 모르기 때문에 템플릿 매개변수로 사용할 수 없습니다.
이 문제를 설명하는 예를 들어보세요.
#include <iostream> template <typename T> void printSize(const T& arg){ struct localStruct { int i; }myLocalStruct; //定义了一个局部结构体类型 std::cout << "Size of arg = "<<sizeof(arg)<<" "; std::cout << "Size of localStruct = "<<sizeof(myLocalStruct)<<" "; } int main() { int x = 5; printSize(x); return 0; }
위 코드에서는 매개변수 arg를 받는 템플릿 함수 printSize를 정의합니다. 또한 로컬 구조 유형 myLocalStruct를 정의하고 sizeof를 사용하여 해당 크기와 매개변수 arg를 가져옵니다.
이 코드를 컴파일하면 "로컬 유형은 템플릿 매개변수로 허용되지 않습니다"라는 오류 메시지가 표시됩니다.
이 문제를 해결하려면 로컬 유형을 글로벌 유형으로 변환해야 합니다. 지역 유형 정의를 함수 외부로 이동하거나 이를 클래스의 멤버 유형으로 정의할 수 있습니다.
글로벌 유형을 사용하여 위 코드를 어떻게 수정할 수 있는지 살펴보겠습니다.
#include <iostream> struct localStruct { int i; }; //将局部结构体类型定义为全局 template <typename T> void printSize(const T& arg){ localStruct myLocalStruct; std::cout << "Size of arg = "<<sizeof(arg)<<" "; std::cout << "Size of localStruct = "<<sizeof(myLocalStruct)<<" "; } int main() { int x = 5; printSize(x); return 0; }
이제 로컬 구조체 정의를 함수 외부로 옮겼습니다. 이 수정 사항은 성공적으로 컴파일 및 실행되며 출력은 정확합니다.
로컬 유형을 전역 유형으로 변환하는 것 외에도 또 다른 해결책은 로컬 유형을 클래스의 멤버 유형으로 정의하는 것입니다. 이 접근 방식에는 몇 가지 추가 코드가 필요하지만 때로는 더 편리합니다.
#include <iostream> template <typename T> class myClass{ public: struct localStruct { int i; }; void printSize(const T& arg){ localStruct myLocalStruct; std::cout << "Size of arg = "<<sizeof(arg)<<" "; std::cout << "Size of localStruct = "<<sizeof(myLocalStruct)<<" "; } }; int main() { int x = 5; myClass<int> obj; obj.printSize(x); return 0; }
위 코드에서는 로컬 구조체 유형을 myClass의 멤버 유형으로 정의합니다. 또한 이 수정 사항은 성공적으로 컴파일 및 실행되어 올바른 결과를 출력합니다.
요약하자면, C++ 템플릿을 사용할 때 "로컬 유형은 템플릿 매개변수로 허용되지 않습니다"라는 컴파일 오류가 발생하면 로컬 유형을 전역 유형이나 클래스의 멤버 유형으로 변환해야 합니다. 이러한 수정으로 이 문제를 성공적으로 해결할 수 있습니다.
위 내용은 C++ 컴파일 오류: 로컬 유형은 템플릿 매개변수로 허용되지 않습니다. 어떻게 처리해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!