什么是“运算符T *(void)”以及何时调用它?

时间:2008-11-08 20:41:25

标签: c++

我有2个文件:

/****demo.cpp****/
#include <iostream.h>
#include "gc.h"

class foo{};

int main(){
    gc<foo> x1;
    cout<<x1;
}

/*****gc.h*****/
template <class T> class gc 
{
    T* ptr;
public:
    operator T*(){}
};

如果我不写operator T*(){},那么我会遇到很多编译错误。

那么请告诉我什么是operator T*(void)以及什么时候被调用?

2 个答案:

答案 0 :(得分:3)

关于你的问题

operator type ()是一个所谓的强制算子。如果需要转换为type,则使用该运算符函数进行转换。

在你的例子中,cout使用你的operator T* ()使用用户定义的隐式转换将x1对象转换为指针,然后由ostream输出(cout是类std :: ostream){{1}这需要一个空白*。

其他问题

为了帮助您找出其他问题,请将标题文件名从operator<<更改为iostream.h。标准C ++不知道iostream。在C ++成为标准之前,这些文件被称为。此外,您使用的所有C标头(如iostream.h)在C ++中仍然有效,但它们是所谓的向后兼容标头文件。您应该包含例如math.h, stdio.hcmath。这将把C中不是宏的所有名称放入cstdio。不使用namespace std,而是使用cout。同样也适用于其他标识符。

答案 1 :(得分:2)

运算符T*(){}cast operator。您正在提供一个可用于从gc<T>转换为T*的函数...虽然它应该要求您实际返回一些内容,在这种情况下可能是ptr

问题是编译器不知道如何将gc对象格式化为输出流。

通过提供从gc到foo *的强制转换,它能够将对象输出为指针值...可能不是你想要的。

您可能希望为&lt;&lt;定义自定义重载运算符转出你的班级:

template <class T>
std::ostream& operator<<( std::ostream& os, const gc<T>& x)
{
    // os << .. something useful here ..
    return os;
}