c++ 错误在模板函数当我甚至没有使用它

q8l4jmvw  于 2023-05-24  发布在  其他
关注(0)|答案(2)|浏览(99)
#include <iostream>
#include <string>
#include <typeinfo>
using namespace std;

template<class T>
T maxn(T* a,int n);

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

int main()
{
//    int n6[6]{21,56,89,49,258,41};
//    double n4[4]{2.1,5.6,8.9,4.9};
//    auto m=maxn(n6,6);
//    auto n=maxn(n4,4);
//    cout<<m<<endl;
//    cout<<n<<endl;
    const char* words[3]={"one","two","three"};
//    maxn(words,3);
    return 0;
}

template<> void maxn(const char* s[],int n)
{
    cout<<"ok";
}

template<class T>
T maxn(T* a,int n)
{
    T max=a[0];
    for (int i=1;i<n;i++)
    {
        if (a[i]>max)
        {
            max=a[i];
        }
    }
    return max;
}

我想写一个maxn()的显式特殊化,它传递一个char*[]数组作为参数,但当我甚至没有调用函数时,它报告以下错误:
[错误] template-id 'maxn<>' for 'void maxn(const char**,int)'不匹配任何模板声明
[注]候选人为:'template T maxn(T*,int)'

kognpnkq

kognpnkq1#

特殊化必须接受T*并返回T。您的特化返回void,这是不正确的。
返回T如下:

#include <iostream>
#include <string>

using namespace std;

template<class T>
T maxn(T* a,int n);

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

int main()
{
    const char* words[3]={"one","two","three"};
    return 0;
}

template<> const char* maxn(const char* s[],int n)
{
    cout<<"ok";
    return nullptr; // Fix this
}

template<class T>
T maxn(T* a,int n)
{
    T max=a[0];
    for (int i=1;i<n;i++)
    {
        if (a[i]>max)
        {
            max=a[i];
        }
    }
    return max;
}

或者像这样定义主模板:

template<class T,class Ret>
Ret maxn(T* a,int n);
hgb9j2n6

hgb9j2n62#

由于我们可以用普通的非模板函数重载函数模板,因此***不需要为函数模板提供显式的特殊化***,如下所示。
看看你的代码(特别是显式专门化中的返回类型和参数类型),似乎这就是你要找的。

template<class T>
T maxn(T* a,int n);

//removed template<> from here so that this becomes a non-template function
void maxn(const char* s[],int n)
{
    cout<<"ok";
}
 
template<class T>
T maxn(T* a,int n)
{
    T max=a[0];
    for (int i=1;i<n;i++)
    {
        if (a[i]>max)
        {
            max=a[i];
        }
    }
    return max;
}
int main()
{

    const char* words[3]={"one","two","three"};
    maxn(words,3);//works now
}

Working demo

相关问题