我有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)
以及什么时候被调用?
答案 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.h
和cmath
。这将把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;
}