cout char *打印地址而不是值

时间:2014-04-05 07:05:14

标签: c++ templates pointers iostream cout

在模板类中,我重载了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 个答案:

答案 0 :(得分:2)

char *是一个特例。对于任何其他指针,除非你自己实现了一些特殊化,否则输出指针会输出指针,而不是它指向的指针。

答案 1 :(得分:0)

问题在于,在您的情况下,Tchar[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&引用。