c++ - Pembentukan templat fungsi Saya telah menyahpepijat selama 1 jam Saya telah mencuba semua cara dan jawapan standard adalah betul, tetapi ia tidak boleh disusun.
高洛峰
高洛峰 2017-05-16 13:27:45
0
3
643

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

Mesej ralat: main.cpp:43:23: Ralat: Pengecam templat 'maxn<const char

[]>' 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;
}
高洛峰
高洛峰

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

membalas semua(3)
洪涛

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;

定义:

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);

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

Definisi:

rrreee 🎜Anda melakukan tiga kesilapan: 🎜
  • 🎜Sintaks pengkhususan yang salah🎜
  • 🎜Dua jenis T tidak konsisten semasa pengkhususan🎜
  • 🎜Banyak petunjuk tidak dinyahrujukkan🎜

🎜Idea:🎜 🎜Pengisytiharan templat: template<nama taip T> T maxn(T x, int n);

Panggilan: maxn(sx, 5). Jenis pembolehubah sx ialah const char *[5], iaitu jenis tatasusunan. 🎜 🎜Memandangkan sx ialah jenis tatasusunan, parameter formal templat adalah dalam bentuk T, di mana sx akan ditukar secara tersirat kepada jenis penuding (penukaran tatasusunan kepada penuding) const char ** code>, Iaitu, T ialah const char **. 🎜 🎜Jadi pengkhususan hendaklah
template<> 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:

template<typename T>T maxn(T x[], int n);
template<>const char* maxn<const char*>(const char* x[], int n);

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:

template<typename T>T maxn(const T x[], int n);
template<>const char* maxn<const char*>(const char* const x[], int n);

template<>const char* maxn<const char*>(const char* const 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(const 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];
}
漂亮男人

Anda menulis versi khas yang salah.

template<>const char* maxn<const char*[]>(const char* x[], int n);

Postur yang betul:

const char* maxn(const char* x[], int n);
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan