>  기사  >  백엔드 개발  >  C++ 컴파일 오류: 여러 멤버에서 템플릿 파생에 실패했습니다. 어떻게 해결합니까?

C++ 컴파일 오류: 여러 멤버에서 템플릿 파생에 실패했습니다. 어떻게 해결합니까?

WBOY
WBOY원래의
2023-08-22 15:15:14570검색

C++ 컴파일 오류: 여러 멤버에서 템플릿 파생에 실패했습니다. 어떻게 해결합니까?

C++에서 템플릿을 사용할 때 때때로 컴파일 오류가 발생합니다. 오류 메시지는 "여러 멤버에서 템플릿 파생에 실패했습니다."입니다. 이 오류는 일반적인 템플릿 오류 중 하나입니다. 그렇다면 이 문제를 어떻게 해결해야 할까요?

먼저 템플릿의 몇 가지 기본 사항을 이해해야 합니다. 템플릿은 C++에서 중요한 개념입니다. 공통 코드를 템플릿으로 작성할 수 있으므로 코드를 더욱 유연하게 만들고 다양한 데이터 유형에 적용할 수 있습니다. C++의 템플릿 구문은 매우 유연합니다. 함수 템플릿, 클래스 템플릿, 멤버 함수 템플릿 등을 정의할 수 있습니다.

템플릿을 사용할 때 컴파일러는 특정 템플릿 인스턴스를 얻기 위해 호출의 매개변수 유형을 기반으로 유형 추론을 수행합니다. 그러나 때로는 컴파일러가 특정 유형을 추론할 수 없으며 "여러 멤버에서 파생되지 못했습니다"라는 오류가 나타납니다. 이 오류 시나리오를 이해하기 위해 몇 가지 예를 살펴보겠습니다.

예제 1:

template<typename T>
void Print(T value) {
    cout << value << endl;
}

int main() {
    Print("hello");
    return 0;
}

이 예에서는 모든 유형의 값을 인쇄할 수 있는 일반 인쇄 함수 Print를 정의합니다. 메인 함수에서는 Print 함수를 호출하고 문자열 매개변수를 전달합니다. 그러나 컴파일러는 특정 유형을 추론할 수 없으며 오류를 보고합니다.

예제 2:

template<typename T>
T Max(T a, T b) {
    return a > b ? a : b;
}

int main() {
    cout << Max(3, 5.7) << endl;
    return 0;
}

이 예에서는 모든 유형의 값에서 최대값을 찾을 수 있는 일반 최대값 함수 Max를 정의합니다. 메인 함수에서는 Max 함수를 호출하고 정수와 부동 소수점 매개변수를 전달합니다. 그러나 컴파일러는 특정 유형을 추론할 수 없으며 오류를 보고합니다.

위의 두 예에서는 특정 유형이 다르기 때문에 컴파일러는 특정 유형을 추론할 수 없으므로 "여러 멤버에서 파생하지 못했습니다."라는 오류가 발생합니다.

그렇다면 이 문제를 어떻게 해결해야 할까요? 다음 접근 방식을 취할 수 있습니다.

  1. 템플릿 매개 변수 유형을 명시적으로 지정

템플릿 함수나 클래스를 호출할 때 템플릿 매개 변수 유형을 명시적으로 지정할 수 있으므로 컴파일러는 지정된 유형에서 특정 템플릿 인스턴스를 추론할 수 있습니다. 예:

Print<string>("hello"); // 明确指定T为string类型
cout << Max<int>(3, 5.7) << endl; // 明确指定T为int类型
  1. 오버로딩 사용

템플릿 함수 또는 클래스의 구현을 여러 버전으로 작성할 수 있으며, 각 버전은 서로 다른 데이터 유형을 대상으로 하며 유형 추론을 별도로 수행합니다. 이것은 과부하입니다. 예:

template<typename T>
void Print(T value) {
    cout << value << endl;
}

void Print(const char* value) {
    cout << string(value) << endl;
}

int main() {
    Print("hello"); // 调用重载版本的Print
    return 0;
}
  1. 템플릿 함수 전문화 사용

특정 유형에 대한 템플릿 함수 또는 클래스의 특수 버전을 제공할 수 있으므로 컴파일러는 이러한 특수 버전을 유형 추론에 사용할 수 있습니다. 예:

template<typename T>
void Print(T value) {
    cout << value << endl;
}

template<>
void Print(const char* value) { // 为const char*类型提供特化版本
    cout << string(value) << endl;
}

int main() {
    Print("hello"); // 调用特化版本的Print
    return 0;
}

요약:

C++에서 템플릿을 사용할 때 "여러 멤버에서 템플릿 파생에 실패했습니다."라는 오류가 일반적인 문제입니다. 템플릿 매개변수 유형을 명시적으로 지정하고, 오버로딩을 사용하고, 템플릿 함수 전문화를 사용하는 등 이 문제를 해결하기 위해 몇 가지 조치를 취할 수 있습니다. 이러한 기술을 익히면 C++ 템플릿을 보다 능숙하게 사용하고 보다 유연한 코드를 작성할 수 있습니다.

위 내용은 C++ 컴파일 오류: 여러 멤버에서 템플릿 파생에 실패했습니다. 어떻게 해결합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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