我正在尝试重载<<运营商。我期待输出为InitializingHello WorldOut,但它只是输出Hello World。我无法弄清楚我的代码有什么问题。谢谢你的帮助。
#include <iostream>
using namespace std;
ostream &operator << (ostream &out, const char* &s)
{
out << "Initializing" << s << "Out";
return out;
}
void main() {
cout << "Hello World" << endl;
system("Pause");
}
答案 0 :(得分:3)
"Hello World"
实际上是const char[12]
类型,它可以衰减为const char *
类型的r值(临时),但您的函数需要引用到const char*
,你可能知道,你不能绑定对非const r值的引用。因此,不会调用您的运算符,而是标准ostream &operator << (ostream &out, const char* s)
。
PS。请不要写void main()
。它应该是int main()
,除非您在嵌入式系统中(不太可能)。
答案 1 :(得分:2)
&lt;&lt;&lt;&lt;&lt;&lt;与完全相同的原型。编译器无法决定使用哪个...
答案 2 :(得分:1)
标准库中已定义operator<<
const char*
,用于输出。您的重载未使用,因为临时字符串文字不能绑定到运算符第二个参数中的非const
引用。
如果删除引用或将其设为const,则会调用 运算符。它甚至不会与标准库中的那个冲突,因为那个实现为函数模板。你的不是,编译器首选非模板化函数。
如果随后调用它,则会导致堆栈溢出,因为out << "Initializing"
会立即再次递归调用同一个运算符。
答案 3 :(得分:0)
我认为由于左侧是std
命名空间,因此它使用的是ostream& std::operator << (ostream &out, const char* s)
命名空间中定义的函数std
,而不是全局命名空间中的std
。如果您尝试将其置于struct charptr {
const char* ptr;
charptr(const char* p) :ptr(p) {}
};
ostream &operator << (ostream &out, const charptr &s)
{
out << "Initializing" << s.ptr << "Out";
return out;
}
int main() { //int main, not void
cout << charptr("Hello World") << endl;
system("Pause");
}
命名空间中,则会出现链接器错误。你唯一真正的希望是改变一方或另一方的类型,可能是通过围绕它们制作包装。
{{1}}
答案 4 :(得分:0)
const char[x]
,我有一个邪恶的想法:
#include <iostream>
using namespace std;
template<int len>
ostream &operator << (ostream &out, const char (&s)[len])
{
out << ((const char*)"Initializing") << ((const char*)s) << ((const char*)"Out");
return out;
}
int main() {
cout << "Hello World" << endl;
}