C ++插入运算符重载(<<)

时间:2016-10-21 14:45:33

标签: c++ pointers reference operator-overloading overload-resolution

我正在完成一项任务,我必须重载插入运算符以获取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";

2 个答案:

答案 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>&一样,与世界上所有其他的插入器一样。我认为这是一项任务所施加的限制;如果是这样,那就是愚蠢的。你被教得很差。