> 백엔드 개발 > C++ > C++ 컴파일 오류: 템플릿 오버로드가 유효하지 않습니다. 어떻게 해결합니까?

C++ 컴파일 오류: 템플릿 오버로드가 유효하지 않습니다. 어떻게 해결합니까?

PHPz
풀어 주다: 2023-08-22 12:49:05
원래의
1313명이 탐색했습니다.

C++ 컴파일 오류: 템플릿 오버로드가 유효하지 않습니다. 어떻게 해결합니까?

C++는 다양한 애플리케이션을 개발하는 데 자주 사용되는 강력한 프로그래밍 언어입니다. 그러나 C++ 코드를 작성하는 과정에서 필연적으로 다양한 문제에 직면하게 되는데, 그 중 하나가 잘못된 템플릿 오버로드 문제입니다. 이 문제를 제대로 처리하지 않으면 컴파일 오류가 발생합니다. 그렇다면 이 문제를 어떻게 해결합니까?

우선 템플릿 오버로딩이 무엇인지 이해해야 합니다. C++에서 템플릿 오버로드는 이름은 동일하지만 매개변수의 수나 유형이 다른 여러 템플릿을 선언하는 것을 의미합니다. 다양한 매개변수가 있는 클래스 또는 함수 템플릿을 사용하는 경우 컴파일러는 템플릿에 정의된 매개변수 유형을 기반으로 적절한 템플릿을 자동으로 선택합니다. 그러나 템플릿을 정의할 때 동일한 매개변수 유형과 개수로 두 개 이상의 템플릿이 정의되고, 반환 유형도 동일한 경우 잘못된 템플릿 오버로드 문제가 발생합니다.

다음으로 잘못된 문제를 오버로드하는 몇 가지 일반적인 템플릿과 그 해결 방법을 살펴보겠습니다.

  1. 오류 예 1:
template <typename T>
void print(T x) {
    cout << "x = " << x << endl;
}

template <typename T>
void print(T* x) {
    cout << "x* = " << *x << endl;
}

int main() {
    int x = 1;
    int* ptr = &x;
    print(x);   // 1
    print(ptr); // Cannot resolve overloaded function 'print' 
    return 0;
}
로그인 후 복사

이 예에서는 이름은 같지만 매개 변수가 다른 두 개의 템플릿을 정의합니다. 템플릿 함수 <코드> print는 변수와 포인터를 각각 인쇄하는 데 사용됩니다. 그러나 포인터 매개변수와 함께 print 함수를 사용하면 컴파일 오류가 발생합니다. print,分别用于打印变量和指针。然而,在我们使用带有指针参数的print函数时,我们得到了一个编译错误。

这是因为C++编译器需要通过参数类型来确定调用哪个函数模板。在这个例子中,指针也是一种T类型的参数,但与int类型不同。因此,编译器无法确定调用哪个函数,导致模板重载无效。解决这个问题的方法是为指针参数提供一个不同的类型,如下所示:

template <typename T>
void print(T x) {
    cout << "x = " << x << endl;
}

template <typename T>
void print(T* x) {
    cout << "x* = " << *x << endl;
}

template <typename T>
void print(T*& x) { // 指针引用增加参数类型
    cout << "x* = " << *x << endl;
}

int main() {
    int x = 1;
    int* ptr = &x;
    print(x);   // 1
    print(ptr); // x* = 1
    return 0;
}
로그인 후 복사

在这个例子中,我们添加了一个新的模板函数print(T*& x),该函数有一个指针引用参数类型,结果可以成功打印一个指针。

  1. 错误示例2:
template <typename T1,typename T2>
void swap(T1& a, T2& b) {
    T1 temp = a;
    a = b;
    b = temp;
}

template <typename T>
void swap(T& a, T& b) {
    T temp = a;
    a = b;
    b = temp;
}

int main() {
    int x = 1,y = 2;
    double d1 = 1.1,d2 = 2.2;
    swap(x,y);
    swap(d1,d2);
    swap(x,d2); // Cannot resolve overloaded function 'swap'
    return 0;
}
로그인 후 복사

在这个例子中,我们定义了两个名字相同但参数不同的模板函数swap,一个用于交换两个不同类型的变量,另一个则用于交换同一类型的变量。然而,在我们交换一个int类型的变量和一个double类型的变量时,我们又得到了一个编译错误。

这是因为在这种情况下,编译器无法根据参数类型区分哪个swap函数应该被调用,导致模板重载无效。为了解决这个问题,我们需要强制指定调用哪个swap函数,如下所示:

template <typename T1,typename T2>
void swap(T1& a, T2& b) {
    T1 temp = a;
    a = b;
    b = temp;
}

template <typename T>
void swap(T& a, T& b) {
    T temp = a;
    a = b;
    b = temp;
}

int main() {
    int x = 1,y = 2;
    double d1 = 1.1,d2 = 2.2;
    swap(x,y);
    swap(d1,d2);
    swap<int,double>(x,d2); // 使用模板实参指定调用哪个模板函数
    return 0;
}
로그인 후 복사

在这个例子中,我们在调用swap<int>(x,d2)</int>时,使用了模板实参<int></int>来指定调用哪个swap

이것은 C++ 컴파일러가 매개변수 유형을 통해 호출할 함수 템플릿을 결정해야 하기 때문입니다. 이 예에서 포인터는 T 유형의 매개변수이기도 하지만 int 유형은 아닙니다. 따라서 컴파일러는 호출할 함수를 결정할 수 없으므로 템플릿 오버로드가 유효하지 않게 됩니다. 이 문제를 해결하는 방법은 다음과 같이 포인터 매개변수에 대해 다른 유형을 제공하는 것입니다.

rrreee

이 예에서는 새 템플릿 함수 print(T*& x)를 추가했습니다. 함수에는 포인터 참조 매개변수 유형이 있으며 결과는 성공적으로 포인터를 인쇄할 수 있습니다.

    오류 예 2: 🎜🎜rrreee🎜이 예에서는 이름은 같지만 매개변수가 다른 두 개의 템플릿 함수 swap를 정의합니다. 하나는 서로 다른 두 변수를 교환하기 위한 것입니다. 유형이고 다른 하나는 동일한 유형의 변수를 교환하는 데 사용됩니다. 그러나 int 유형의 변수를 double 유형의 변수와 교환하면 또 다른 컴파일 오류가 발생합니다. 🎜🎜이 경우 컴파일러는 매개변수 유형에 따라 어떤 swap 함수를 호출해야 하는지 구별할 수 없어 잘못된 템플릿 오버로드가 발생하기 때문입니다. 이 문제를 해결하려면 아래와 같이 어떤 swap 함수가 호출되는지 강제로 지정해야 합니다. 🎜rrreee🎜이 예에서는 swap<int>(x,d2를 호출합니다. ) </int>에서 템플릿 실제 매개변수 <int></int>는 호출할 swap 함수를 지정하는 데 사용되며, 이는 잘못된 템플릿 오버로드 문제를 해결합니다. 🎜🎜요약: 🎜🎜잘못된 템플릿 오버로드는 C++ 작성에서 흔히 발생하는 오류입니다. 일반적으로 정의는 동일하지만 매개변수나 반환 유형이 약간 다른 오버로드된 함수로 인해 발생합니다. 이 문제를 방지하려면 각 템플릿 함수에 대해 서로 다른 매개변수 유형과 반환 유형을 제공하고 템플릿 인수를 사용하여 호출해야 하는 함수를 지정해야 합니다. 이러한 방법을 통해 잘못된 템플릿 오버로드 문제를 해결하고 C++ 코드를 더욱 강력하고 완전하게 만들 수 있습니다. 🎜

위 내용은 C++ 컴파일 오류: 템플릿 오버로드가 유효하지 않습니다. 어떻게 해결합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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