2015-10-15 49 views
-2

我有一个小问题把我的链接列表< <运算符。下面的代码:编译器不使用运算符<<

ostream& operator<<(ostream& o,const Node& f) 
{ 
    Node *p = new Node(f.val); 
    p->next = f.next; 
    p->prev = f.prev; 
    o << "["; 
    while(p->next->val != -1) 
    { 
     p = p->next; 
     o << p->val << " "; 
    } 
    o << "]" << endl; 
    delete p; 
    return o; 
} 

所以,当我用它在main(),它看起来是这样的:

BiQueue bq(); 
bq.Push(5); 
... 
cout << bq.getFirst(); 

但是经过测试,运营商只是不运行,输出一个内存地址。 所以我直接测试它: cout << first;(其中第一个是Node *),它输出一个内存地址,所以操作员没有被使用。

+0

你是否在类BiQueue中声明了'ostream&operator <<(ostream&o,const Node&f)'作为朋友函数? – user1

+0

是的,它是一个朋友功能 – user3741975

+0

不相关:动态分配一个节点对象只是为了能够流式传输看起来很浪费。 – juanchopanza

回答

2

您告诉编译器如何打印Node,但您打印Node *。这些是不同的类型。要获得您想要的行为,请尝试cout << *first;cout << *bq.getFirst();

2

运算符只是不运行,输出是内存地址。

取而代之的是:

Node *first = ...; 
cout << first; 

你需要这样的:

Node &first = ...; 
cout << first; 

否则你传递一个指针operator<<