【发布时间】:2017-10-20 05:47:27
【问题描述】:
考虑以下示例:
#include <string>
#include <sstream>
struct Location {
unsigned line;
template<typename CharT, typename Traits>
operator std::basic_string<CharT, Traits>() const {
std::basic_ostringstream<CharT, Traits> ss;
ss << line;
return ss.str();
}
};
int main()
{
using namespace std::string_literals;
Location loc{42};
std::string s1 = "Line: "s.append(loc) + "\n"s; // fine
//std::string s2 = "Line: "s + loc + "\n"s; // error
}
注释行导致编译错误:no match for 'operator+'。为什么?我最初的想法是它会首先使用operator std::string 进行转换,然后执行对operator+ 的调用,就像它对.append 所做的那样。
这只是隐式转换的一级,所以应该执行并且应该考虑到,不是吗?
【问题讨论】:
-
抱歉问,但我看不到工作代码。
s是什么? -
好的@Holt,谢谢!
-
这里的问题是当你做
.append的时候,模板参数已经在"Line"s的构造过程中被实例化了,所以没有发生模板参数推导(.append想要std::string),但是+运算符是模板化的,所以你需要推导出CharT、Traits和Allocator,你不能因为编译器无法匹配basic_string<...>和Location- 你甚至没有达到转换阶段,失败的是过载阶段。 -
@Holt 谢谢。我正在寻找技术解释。如果您作为完整答案发布,我会接受。
标签: c++ c++11 operator-overloading conversion-operator