我正在完成一项任务,我必须重载插入运算符以获取Node对象。我在类定义之外创建了运算符重载函数,但是在node.h文件中。一切都编译得很好,但是没有调用重载的运算符,而是简单地得到了对象的地址。
我禁止修改调用代码,因此任何更改都必须是操作员超载。
我现在的代码:
/** 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";
答案 0 :(得分:3)
请注意,参数pHead
的类型是对非const的引用,const Node<T>*
是指向const的非const指针,参数n
&#39 ; s类型是Node<T>*
(即非const的非const指针)。它们的类型不匹配,Node<T>*
需要转换为const Node<T>*
,这是一个临时的,不能绑定引用非const。
简而言之,您不能将对非const的引用绑定到具有不同类型的对象。
但对const的引用可以绑定到临时,因此您可以更改参数类型以引用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)
答案 1 :(得分:1)
问题是插入器采用const Node<T>*
类型的参数,但是使用Node<T>*
类型的参数调用它;没有从T*
到const T*
的转换。因此,“修复”是从流插入器中删除const
。
但是,正如在评论中暗示的那样,拥有一个指向某种类型的指针的插入器是一个坏主意。它应该像const Node<T>&
一样,与世界上所有其他的插入器一样。我认为这是一项任务所施加的限制;如果是这样,那就是愚蠢的。你被教得很差。