【发布时间】:2021-12-25 18:55:41
【问题描述】:
我正在学习 C++ 中的函数模板专业化,我的任务是编写一个名为 plus 的模板函数,它返回它可能是不同类型的两个参数的总和。一个按值接受的版本,另一个按指针接受的版本。作为一个额外的挑战,我被要求重载这个函数,以便它连接两个字符串。
template <typename T1, typename T2> decltype(auto) plus(const T1& a, const T2& b) {
return a + b;
}
template <typename T1, typename T2> decltype(auto) plus(const T1* a, const T2* b) {
return *a + *b;
}
// concatenate two strings
template <>
std::string_view plus<std::string_view, std::string_view> (std::string_view a, std::string_view b) {
return std::string { a } + std::string{ b };
}
问题是我在连接两个字符串的函数的特化重载上遇到错误。我决定选择 std::string_view 而不是 std::string 的原因是,当使用字符串文字 (const char*) 调用函数时,它不会解析为接受 const * 的第二个定义,我猜这将是解决了std::string。
所以我真的无法弄清楚发生了什么。只是一个疯狂的猜测,但这可能与我有两个不同的模板函数(称为 plus)有关,但它无法确定我正在尝试专门化/重载哪个模板函数?
更新:
问题似乎与模板解析有关。接受 const T* 的定义始终是任何字符串文字的首选。只是想找到解决办法。
【问题讨论】:
-
模板是红鲱鱼。没有为字符串视图定义 + 运算符。在普通的非模板函数中你会遇到这个问题。
-
@RaymondChen 已修复,我的代码中的
std::string构造函数只是粘贴了错误的定义。 -
@RaymondChen 我还尝试专门针对字符串文字使用
const char*,但仍然是没有重载函数实例的问题。 -
我已将问题缩小到函数负载分辨率。无论我如何专门化模板,它仍然更喜欢使用指针的第二个定义。
标签: c++ templates overload-resolution function-templates-overloading