Was ich mache, ist Frage 6 von Kapitel 8 zu C++ Primer Plus
Es erfordert die Erstellung von zwei Funktionsvorlagen, eine für int double-Arrays und eine weitere Vorlage, die char*[] verwendet.
int und double sind kein Problem Ich weiß lange nicht, warum es nicht kompiliert werden kann. Dann habe ich es erneut mit einer normalen Funktion geschrieben und festgestellt, dass es dann nach langer Arbeit normal ausgeführt werden kann funktioniert nicht, ich habe online nach Antworten gesucht und festgestellt, dass ich die gleiche Antwort geschrieben habe. Das Format ist im Grunde dasselbe. Es kann einfach nicht kompiliert werden
Fehlermeldung: main.cpp:43:23: Fehler: Die Vorlagenkennung „maxn<const char
[]>“ von „const char
, int)“ stimmt mit keiner Vorlagendeklaration template< überein ; >const char maxn<const char[]>(const char* x[], int n) Code:
#include <cstring>
#include <iostream>
using namespace std;
template<typename T>T maxn(T x, int n);
template<>const char* maxn<const char*[]>(const char* x[], int n);
/*
* 模板函数针对不同类型数组 输出数组中最大的那个值
*/
int main(int argc, char** argv) {
int ix[6] = {34, 12, 343, 1, 43, 31};
double dx[4] = {1.34, 1231.2, 34.3, 44.23};
const char* sx[5] = {"abcde", "fedcba", "abcdefg", "12345", "qwert"};
cout << "ix[6] max: " << *maxn(ix, sizeof ix / sizeof ix[0]) << endl;
cout << "dx[4] max: " << *maxn(dx, sizeof dx / sizeof dx[0]) << endl;
cout << "sx[5] max_address: " << (int*) maxn(sx, 5) << endl;
cout << "Press Enter To Exit..." << endl;
cin.get();
return 0;
}
//这个是我自己写的普通函数,能运行
//const char* maxn(const char* x[5],int n) {
// const char* max_len = x[0];
// 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;
//}
template<>const char* maxn<const char*[]>(const char* x[], int n)
{
const char* max_len = x[0];
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;
}
template<typename T>
T maxn(T x, int n) {
for (int i = 0; i < n - 1; i++) {
x[i + 1] = x[i] > x[i + 1] ? x[i] : x[i + 1];
}
return x + n - 1;
}
声明:
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);
PS:直觉上应该还可以有个引用版本的特化。但是因为T推导不出引用类型,所以这里不会调用引用版本的特化。当然可以提供模板参数,来调用这个特化。
按我理解,maxn这个函数应该是想返回长度为n的数组中“最大”的那个元素,所以我觉得函数声明应该写成这样:
按这个声明,把你的实现改一下,就可以通过编译了。
以下代码是在你原来代码基础上做了简单修改,在vs2017中编译通过,供参考:
特化版本你写错了。
正确姿势: