我正在完成一个分配,在该分配中,我必须重载插入运算符以获取Node对象。我已经在类定义之外但在node.h文件中创建了运算符重载函数。一切都可以正常编译,但是不调用重载运算符,而是简单地获取了对象的地址。

禁止修改调用代码,因此任何更改都必须使运算符(operator)重载。

我现在的代码:

/** OPERATOR << ***********************************/
template<class T>
inline std::ostream & operator << (std::ostream & out, const Node <T> *& pHead)
{
    out << "INCOMPLETE";
    return out;
}

现在,我只想确保调用了重载运算符。一旦知道要调用正确的运算符,我将修复输出代码。

调用代码:
// create
Node <char> * n = NULL;

// code modifying n

// display
cout << "\t{ " << n << " }\n";

最佳答案

请注意,参数pHead的类型是对非常量的引用,const Node<T>*是指向const的非常量指针,参数n的类型是Node<T>*(即,指向非const的非常量指针)。它们的类型不匹配,Node<T>*需要转换为const Node<T>*,这是临时的,不能绑定(bind)对非const的引用。

简而言之,您不能将对非常量的引用绑定(bind)到具有不同类型的对象。

但是对const的引用可以绑定(bind)到临时对象,因此您可以将参数类型更改为对const的引用:

template<class T>
inline std::ostream & operator << (std::ostream & out, const Node <T> * const & pHead)
//                                                                      ~~~~~

或者将其更改为按值传递,当作为参数传递时,Node<T>*将隐式转换为const Node<T>*。 (通过引用将指针传递给const并没有多大意义。)
template<class T>
inline std::ostream & operator << (std::ostream & out, const Node <T> * pHead)

最后,用指针类型重载operator<<看起来很奇怪。用户定义类型最常见的形式是:
template<class T>
std::ostream & operator << (std::ostream & out, const Node <T> & pHead)

10-06 04:09
查看更多