首页 > 解决方案 > 模板专业化不匹配错误

问题描述

重新编辑:

这是C++ Primer 5th所说的:

版本 1:

template <typename T> int compare(const T&, const T&);

版本 2:

template<size_t N, size_t M> int compare(const char (&)[N], const char (&)[M]);

版本 1 的特化:

template <> int compare(const char* const &p1, const char* const &p2);

例如,我们定义了两个版本compare函数模板,一个接受对数组参数的引用,另一个接受 const T&. 我们还专门针对字符指针的事实对函数匹配没有影响。当我们在字符串文字上调用 compare 时:compare("hi", "mom") 两个函数模板都是可行的,并且为调用提供了同样好的(即精确)匹配。但是,带有字符数组参数的版本更专业(第 16.3 节,第 695 页)并被选择用于此调用。


这本书说“两者都提供了同样好的匹配”,所以我认为将版本 1 及其专业化应该编译得很好。但它没有。

所以“提供同样好的匹配”并不意味着它可以编译?书在捉弄我?

我不明白为什么无法编译的原始代码片段链接: https ://wandbox.org/permlink/oSCDWad03nELC9xs


完整的上下文截图(我已经把最相关的部分装箱了,很抱歉在这里发布这么大的图片)。

在此处输入图像描述 在此处输入图像描述

标签: c++

解决方案


C 风格的字符串不是指针,它们是数组。当模板类型推导发生时,它推导Tconst char[3]or const char[4]。由于这些冲突,编译器无法推断T并停在那里。

template<>
int compare(const char* const &p1, const char* const&p2) {
    cout << "const char* const" << endl;
    return 3;
}

不会被调用,因为它依赖于T被推断和匹配const char*并且编译器无法推断T。专业化不是超载,它是特定的配方T。如果T无法推导出,则不会调用专业化,即使它是有效的重载。

如果您要重载该函数而不是提供专门化,那么它将编译为:

int compare(const char* const &p1, const char* const&p2) {
    cout << "const char* const" << endl;
    return 3;
}

推荐阅读