Apa yang saya lakukan ialah Soalan 6 Bab 8 tentang C++ Primer Plus
Ia memerlukan membuat dua templat fungsi, satu untuk tatasusunan berganda int, dan satu lagi templat yang menggunakan char*[]
int dan double tiada masalah pada yang khusus untuk masa yang lama saya tidak tahu mengapa ia tidak boleh disusun Kemudian saya menulisnya lagi menggunakan fungsi normal dan mendapati ia boleh berjalan secara normal tidak berfungsi, saya mencari jawapan dalam talian dan mendapati saya menulis jawapan yang sama
Formatnya pada asasnya sama, cuma ia tidak boleh disusun
[]>' daripada 'const char maxn(const char, int)' tidak sepadan dengan mana-mana templat pengisytiharan templat< ; >const char maxn<const char[]>(const char* x[], int n)
Kod:
#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;
}
Pengisytiharan:templat<> 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 **
。所以特化应当是
Panggilan:template<> const char **maxn(const char **x, int n);
cout << "sx[5] max_address: " << (int*)*maxn(sx, 5) <<- 🎜Sintaks pengkhususan yang salah🎜
- 🎜Dua jenis T tidak konsisten semasa pengkhususan🎜
- 🎜Banyak petunjuk tidak dinyahrujukkan🎜
template<nama taip T> T maxn(T x, int n);
Definisi:
rrreee 🎜Anda melakukan tiga kesilapan: 🎜🎜Idea:🎜 🎜Pengisytiharan templat:
Panggilan:
maxn(sx, 5)
. Jenis pembolehubah sx ialahconst char *[5]
, iaitu jenis tatasusunan. 🎜 🎜Memandangkan sx ialah jenis tatasusunan, parameter formal templat adalah dalam bentukT
, di mana sx akan ditukar secara tersirat kepada jenis penuding (penukaran tatasusunan kepada penuding)const char ** code>, Iaitu, T ialah
const char **
. 🎜 🎜Jadi pengkhususan hendaklahtemplate<> const char **maxn(const char **x, int n);
🎜 🎜PS: Secara intuitif, perlu ada pengkhususan versi rujukan. Tetapi kerana T tidak dapat menyimpulkan jenis rujukan, tiada pengkhususan versi rujukan dipanggil di sini. Sudah tentu, anda boleh menyediakan parameter templat untuk memanggil pengkhususan ini. 🎜Menurut pemahaman saya, fungsi maxn harus mengembalikan elemen "terbesar" dalam susunan panjang n, jadi saya rasa pengisytiharan fungsi harus ditulis seperti ini:
Ikuti kenyataan ini, ubah pelaksanaan anda, dan ia akan disusun.
Kod berikut hanya diubah suai berdasarkan kod asal anda dan disusun dalam vs2017 untuk rujukan:
Anda menulis versi khas yang salah.
Postur yang betul: