在模板类中,我使用以下内容重载了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 *的内容,而不是地址 . 为什么会发生这种情况呢?模板有问题吗?
2 回答
char *
是一个特例 . 对于任何其他指针,除非您自己实现了某些特化,否则输出指针会输出该指针,而不是它指向的指针 .问题是在你的情况下,
T
是char[40]
,它已经是一个指针(相当于char*
) . 这意味着如果您使用T*
,它将变为char**
并且's what you are trying to print. Since it'是指向指针的指针,指针的通用模板将被应用并打印地址 .对于测试,您可以尝试打印:
在这种情况下,您将取消引用指向原始值的指针,即
char[40]
,您应该获得预期的输出 .另外,我认为你的_2560284错了 . 由于您将
T
传递给它,并将其分配给T* m_value
,因此您隐式存储指向本地值的指针 . 您可能希望在构造函数中同样使用T*
. 或两种情况下的T&
参考 .