重载I / O运算符C ++

时间:2011-09-29 22:35:20

标签: c++

我正在尝试重载<<运营商。我期待输出为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");
  }

5 个答案:

答案 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;
  }

http://ideone.com/7wCNy