내가 하고 있는 일은 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)
코드:
으아악
선언:
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;
定义:
你犯了三个错误:
特化语法不对
特化时两处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) <<
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에서 컴파일되었습니다.
스페셜 버전을 잘못 작성하셨습니다.
으아아아올바른 자세:
으아아아