>  기사  >  백엔드 개발  >  C++ 컴파일 오류: 로컬 유형은 템플릿 매개변수로 허용되지 않습니다. 어떻게 처리해야 합니까?

C++ 컴파일 오류: 로컬 유형은 템플릿 매개변수로 허용되지 않습니다. 어떻게 처리해야 합니까?

PHPz
PHPz원래의
2023-08-21 21:39:221541검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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