C++ 入门第 5 版:函数模板重载与专业化

问题描述

我有这个来自 C++ 入门第 5 版的例子:

template <typename T>
int compare(T const& x,T const& y) // in the book const T&
{
    cout << "primary template\n"; // I've added print statements
    if(std::less<T>()(x,y))
        return -1;
    if(std::less<T>()(y,x))
        return 1;
    return 0;
}

template <unsigned N,unsigned M>
int compare(char const(&rArr1)[N],char const(&rArr2)[M])
{
    cout << "overload for arrays\n";
    return strcmp(rArr1,rArr2);
}

template <>
int compare(char const* const &p1,char const* const &p2)
{
    cout << "specilization for char* const\n";
    return strcmp(p1,p2);
}


int main()
{
    std::cout << compare("Hi","Mom") << '\n';
}

“我们将特定函数定义为特化函数还是独立的非模板函数都会影响函数匹配。例如,我们定义了比较函数模板的两个版本,一个引用数组参数,一个引用数组参数另一个采用 const T&。事实上,我们也对字符指针进行了专门化,这对函数匹配没有影响。当我们在字符串文字调用 compare 时:

compare("hi","mom");

两个函数模板都是可行的,并且为调用提供了同样好的(即精确的)匹配。但是,带有字符数组参数的版本更加特殊(第 16.3 节,第 695 页),因此选择用于此调用。”

  • 我认为这是不正确的:“compare("hi","mom"); 两个模板都是可行的”,因为我看到第一个采用 T const&,T const& 的版本不可行,因为它被实例化为:

      compare(char const(&rArra1)[3],char const(&rArr2)[4]);
    

在这种情况下,大小不同,而且我们知道数组的大小是其类型的一部分,因此这里两个文字字符串具有两种不同的类型,因此模板参数推论将失败,因此拒绝此实例化。就好像我们写了:compare(5,0.); // int,double 所以编译器不能像这里要求的那样推断出唯一的类型。

  • 为了确认我所说的,如果我注释掉采用数组类型的版本,那么代码将不会使用两个不同大小的文字字符串为该调用编译。

  • 让我感到困惑的是,如果我注释掉数组类型的版本,即使我有第三个版本(获取指向字符串的指针),代码也不会编译!这是因为专业化不影响功能匹配吗?被主模板拒绝的内容会被其所有专业化拒绝吗?

请说明。谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)