c++ - 함수 템플릿 구체화. 1시간 동안 디버깅을 했습니다. 모든 방법을 시도해 보았지만 표준 답변은 정확했지만 컴파일할 수 없습니다.
高洛峰
高洛峰 2017-05-16 13:27:45
0
3
646

내가 하고 있는 일은 C++ Primer Plus의 8장 질문 6입니다.
두 개의 함수 템플릿을 만들어야 합니다. 하나는 int 이중 배열용이고 다른 하나는 char*[]
int 및 double을 사용하는 템플릿입니다. 저는 문제 없이 작업하고 있습니다.
그런 다음 일반 함수를 사용하여 다시 작성하고 오랫동안 작업한 후에는 정상적으로 실행될 수 있음을 발견했습니다. 작동하지 않아서 온라인에서 답변을 찾았는데 동일한 답변을 썼습니다
기본적으로 형식이 동일하므로 컴파일할 수 없습니다

.

오류 메시지: main.cpp:43:23: 오류: 'const char maxn(const char, int)'의 템플릿 식별자 'maxn<const char []>'이 어떤 템플릿 선언 템플릿과도 일치하지 않습니다< ; >const char maxn<const char[]>(const char* x[], int n)

코드:

으아악
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

모든 응답(3)
洪涛

선언: template<> const char **maxn(const char **x, int n);template<> const char **maxn(const char **x, int n);

调用:cout << "sx[5] max_address: " << (int*)*maxn(sx, 5) << endl;

定义:

template<>
const char **maxn(const char **x, int n)
{
    const char **max_len = x;
    for (int i = 0; i < n - 1; i++)
        max_len = strlen(*max_len) >= strlen(x[i + 1]) ? max_len : &x[i + 1];
    return max_len;
}

你犯了三个错误:

  • 特化语法不对

  • 特化时两处T的类型不一致

  • 多处指针没有解引用


思路:

模板声明:template<typename T> T maxn(T x, int n);
调用:maxn(sx, 5)。其中变量sx的类型是const char *[5],即数组类型。

由于sx是数组类型,模板形式参数的形式是T,这里sx会被隐式转换成指针类型(array to pointer conversion)const char **,即T是const char **

所以特化应当是
template<> const char **maxn(const char **x, int n);

전화: cout << "sx[5] max_address: " << (int*)*maxn(sx, 5) <<

정의: 🎜 으아악 🎜당신은 세 가지 실수를 저질렀습니다: 🎜
  • 🎜잘못된 특수화 구문🎜
  • 🎜두 가지 T 유형은 전문화 과정에서 일관성이 없습니다🎜
  • 🎜많은 포인터가 역참조되지 않습니다🎜
🎜생각:🎜 🎜템플릿 선언: template<typename T> T maxn(T x, int n);
호출: maxn(sx, 5). 변수 sx의 타입은 배열 타입인 const char *[5]입니다. 🎜 🎜sx는 배열 유형이므로 템플릿 형식 매개변수는 T 형식입니다. 여기서 sx는 암시적으로 포인터 유형으로 변환됩니다(배열에서 포인터로 변환) const char ** code>, 즉 T는 const char **입니다. 🎜 🎜그래서 전문화는
template<> const char **maxn(const char **x, int n);🎜이어야 합니다. 🎜PS: 직관적으로 참조 버전에는 전문화가 있어야 합니다. 그러나 T는 참조 유형을 추론할 수 없기 때문에 여기서는 참조 버전의 특수화가 호출되지 않습니다. 물론 템플릿 매개변수를 제공하여 이 전문화를 호출할 수 있습니다. 🎜
洪涛

제가 이해한 바에 따르면 maxn 함수는 길이 n의 배열에서 "가장 큰" 요소를 반환해야 하므로 함수 선언은 다음과 같이 작성해야 한다고 생각합니다.

으아아아

이 설명에 따라 구현을 변경하면 컴파일됩니다.
다음 코드는 원본 코드를 기반으로 간단히 수정되었으며 참조용으로 vs2017에서 컴파일되었습니다.

으아아아
漂亮男人

스페셜 버전을 잘못 작성하셨습니다.

으아아아

올바른 자세:

으아아아
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿