【发布时间】:2019-10-01 10:46:36
【问题描述】:
我了解到 运算符 可以通过使其成为类的友元函数来重载。 例如,
struct Test
{
std::string d_data;
Test(const std::string & data) : d_data{data} {}
friend std::ostream & operator<<(std::ostream & ostr, const Test & obj)
{
ostr << obj.d_data << '\n';
return ostr;
}
};
int main()
{
Test t1("one");
std::cout << t1;
Test t2("two");
std::cout << t2;
}
one two
这似乎按预期工作。
但是,我无法理解为什么同样的方法不适用于全局过载。
#include <iostream>
#include <ostream>
#include <string>
std::ostream & operator<<(std::ostream & os, const std::string & s)
{
os << s << '\n';
return os;
}
int main()
{
std::cout << "stackoverflow";
std::cout << "stackoverflow";
}
stackoverflowstackoverflow
应以换行符分隔字符串,但未按预期工作。
【问题讨论】:
-
您声称有效的第一个示例根本不应该像您展示的那样有效。您显示的重载
operator<<函数不会访问正在传递的对象 (tObj),因此符号d_data是未知的。它不应该建立。创建minimal reproducible example 时,请确保它确实复制了您指定的行为。 -
你不能这样做。运算符中的类型都不是您的,因此该运算符不是您定义的。