>백엔드 개발 >C++ >C++ 구문 오류: 템플릿 매개변수에 템플릿이 아닌 유형을 사용할 수 없습니다. 어떻게 해결합니까?

C++ 구문 오류: 템플릿 매개변수에 템플릿이 아닌 유형을 사용할 수 없습니다. 어떻게 해결합니까?

王林
王林원래의
2023-08-22 11:37:501181검색

C++ 구문 오류: 템플릿 매개변수에 템플릿이 아닌 유형을 사용할 수 없습니다. 어떻게 해결합니까?

C++ 템플릿 프로그래밍에서는 템플릿이 아닌 클래스를 템플릿 매개변수로 사용할 수 있지만 이 사용에는 특정 제한 사항이 있습니다. 템플릿 매개변수로 템플릿이 아닌 유형을 사용하려고 하면 "템플릿 매개변수에 템플릿이 아닌 유형을 사용할 수 없습니다."라는 오류가 발생할 수 있습니다. 이 오류는 일반적으로 C++ 컴파일러가 비템플릿 유형을 처리하는 방법을 결정할 수 없기 때문에 발생합니다.

이 기사에서는 이 오류의 원인과 해결 방법에 대해 설명합니다. 먼저 이 오류의 원인을 살펴본 후 해결 방법을 논의하겠습니다.

오류 원인

다음 코드를 작성할 때: 코드의

template <class T, int N>
class MyClass {
    T array[N];
    // some code here
};

MyClass<int, 10> myClass;

MyClass는 템플릿 클래스이며, 두 개의 템플릿 매개변수 T 및 가 있습니다. 엔. T는 데이터 유형이고 N은 정수입니다. 컴파일러에서 처리한 후 myClassMyClass 클래스의 인스턴스여야 합니다. 여기서 T 유형은 int입니다. , N의 값은 10입니다. MyClass是一个模板类,它有两个模板参数TNT是一个数据类型,N是一个整数。经过编译器的处理后,myClass应该是一个MyClass类的实例,其中T类型为intN值为10

问题出在当我们试图将一个非模板类型作为模板参数来使用时,就会产生错误,例如:

template <class T, int N, double D>
class MyClass2 {
    // some code here
};

MyClass2<int, 10, 3.14> myClass2;

这个代码将double类型的值3.14作为了MyClass2类的第三个模板参数。这是错误的,因为double类型不是一个模板参数,不能在模板参数中使用。

然而,有时我们可能会尝试将一个非模板类作为模板参数来使用。这时,我们可能会遇到“非模板类型不能在模板参数中使用”的错误。例如:

class MyClass3 {
    // some code here
};

template <class T, MyClass3 myClass3>
class MyClass4 {
    // some code here
};

MyClass4<int, MyClass3> myClass4;

这个代码定义了一个名为MyClass4的模板类,其中的第二个模板参数是一个名为myClass3的实例,该实例是MyClass3类的一个对象。在定义myClass4时,我们将MyClass3作为MyClass4的第二个模板参数。然而,这是错误的,因为MyClass3不是一个模板参数,不能在模板参数中使用。

解决方法

有一种方法可以解决这个错误,即将非模板类改为模板类。

template <typename T>
class MyClass5 {
    // some code here
};

template <class T, template <typename> class N>
class MyClass6 {
    N<T> myClass;
    // some code here
};

MyClass6<int, MyClass5> myClass6;

在这个示例中,MyClass6类的第二个模板参数已经变成了模板类。这样,我们就可以将一个模板类作为模板参数来使用了。当我们在定义myClass6时,我们可以使用MyClass5作为MyClass6

문제는 템플릿 매개변수로 템플릿이 아닌 유형을 사용하려고 하면 다음과 같은 오류가 발생한다는 것입니다.

rrreee

이 코드는 double 유형의 값을 3.14 code>는 MyClass2 클래스의 세 번째 템플릿 매개변수 역할을 합니다. 이는 잘못된 것입니다. double 유형은 템플릿 매개변수가 아니고 템플릿 매개변수에 사용할 수 없기 때문입니다.

그러나 때로는 템플릿이 아닌 클래스를 템플릿 매개변수로 사용하려고 할 수도 있습니다. 이때 "템플릿 매개변수에 템플릿이 아닌 유형을 사용할 수 없습니다."라는 오류가 발생할 수 있습니다. 예:

rrreee

이 코드는 MyClass4라는 템플릿 클래스를 정의합니다. 두 번째 템플릿 매개변수는 myClass3라는 인스턴스입니다. 이는 MyClass3입니다. 코드> 클래스. myClass4를 정의할 때 MyClass4의 두 번째 템플릿 매개변수로 MyClass3을 사용합니다. 그러나 MyClass3은 템플릿 매개변수가 아니며 템플릿 매개변수에 사용할 수 없기 때문에 이는 잘못된 것입니다. 🎜🎜Solution🎜🎜이 오류를 해결하는 방법이 있는데, 비템플릿 클래스를 템플릿 클래스로 변경하는 것입니다. 🎜rrreee🎜이 예에서는 MyClass6 클래스의 두 번째 템플릿 매개변수가 템플릿 클래스가 되었습니다. 이러한 방식으로 템플릿 클래스를 템플릿 매개변수로 사용할 수 있습니다. myClass6을 정의할 때 MyClass6의 두 번째 템플릿 매개변수로 MyClass5를 사용할 수 있습니다. 🎜🎜이 방법을 사용하면 "템플릿 매개변수에 템플릿이 아닌 유형을 사용할 수 없습니다." 오류를 효과적으로 해결할 수 있습니다. 이런 방식으로 템플릿 매개변수에서 사용할 수 있도록 비템플릿 유형을 템플릿 유형으로 변경할 수 있습니다. 🎜🎜결론🎜🎜C++로 템플릿을 프로그래밍하는 과정에서 템플릿 매개변수로 템플릿이 아닌 클래스를 사용하려고 할 수도 있지만 이 사용에는 한계가 있습니다. 컴파일러가 이 비템플릿 유형을 처리하는 방법을 결정할 수 없기 때문에 비템플릿 클래스를 템플릿 매개변수로 직접 사용할 수 없습니다. 하지만 비템플릿 유형을 템플릿 유형으로 변경하면 이 문제를 해결할 수 있습니다. 🎜

위 내용은 C++ 구문 오류: 템플릿 매개변수에 템플릿이 아닌 유형을 사용할 수 없습니다. 어떻게 해결합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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