我正在完成一个分配,在该分配中,我必须重载插入运算符以获取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)