在模板类中,我重载了ostream<<运算符具有以下内容:
friend std::ostream& operator<<(std::ostream &out,
const DataItem<T> &cDataItem) {
out << cDataItem.m_value;
return out;
}
并且m_value
被声明为指向泛型类型的指针
T *m_value;
但出于某种原因,当我对该对象进行cout时,它会打印一个十六进制值,我猜这是地址而不是值,正如我所期望的那样:
Value: 0x7fff418f9d40
我了解到带有char *的cout应该打印char *的内容,而不是地址。为什么会发生这种情况呢?模板是个问题吗?
答案 0 :(得分:2)
char *
是一个特例。对于任何其他指针,除非你自己实现了一些特殊化,否则输出指针会输出指针,而不是它指向的指针。
答案 1 :(得分:0)
问题在于,在您的情况下,T
是char[40]
,它已经是指针(相当于char*
)。这意味着,如果您使用T*
,则会变为char**
,这就是您要打印的内容。由于它是指向指针的指针,因此应用指针的通用模板并打印地址。
对于测试,您可以尝试打印:
friend std::ostream& operator<<(std::ostream &out,
const DataItem<T> &cDataItem) {
out << *cDataItem.m_value;
return out;
}
在这种情况下,您将取消引用指向原始值的指针,即char[40]
,您应该得到预期的输出。
另外,我认为您的operator=
错了。由于您将T
传递给它,并将其分配给T* m_value
,因此您隐式存储指向本地值的指针。您可能希望在构造函数中同样使用T*
。或者在两种情况下都是T&
引用。