c++ - 模板专业化不匹配错误
问题描述
重新编辑:
这是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 风格的字符串不是指针,它们是数组。当模板类型推导发生时,它推导T
为const 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;
}
推荐阅读
- sql - MS Access 中的 Group By 和 Groups
- android - Clean Architecture 中的关联数据在哪里组合?
- vb.net - 通过包含属性名称的字符串引用类的属性
- c# - 为什么我的有序列表没有保持有序?
- python - 使用 conda-forge 版本更新以前从 conda 官方安装的包和所有依赖项的正确方法?
- python - Python - 检查上传的 CSV 是否有标题而不保存?
- mongodb - Vote MongoDB 过滤方法适用于 Compass,但不适用于 Python - $and query
- java - 使用 TestNG 和 Java 在 Selenium 中出现数据提供者不匹配错误 org.testng.internal.reflect.MethodMatcherException
- javascript - 无法启动模拟器。原因:没有找到模拟器作为 `emulator -list-avds` 的输出。, 安装应用程序失败
- swift - 使用 SwiftUI 基于用户输入的动态文本字段