代码之家  ›  专栏  ›  技术社区  ›  ranieri

cout char*打印地址而不是值

  •  3
  • ranieri  · 技术社区  · 12 年前

    在模板类中,我重载了ostream<&书信电报;操作员具有以下功能:

    friend std::ostream& operator<<(std::ostream &out,
            const DataItem<T> &cDataItem) {
        out << cDataItem.m_value;
        return out;
    }
    

    和 m_value 声明为指向泛型类型的指针

    T *m_value;
    

    但由于某种原因,当我计算对象时,它会打印一个十六进制值,我猜这是地址而不是值,正如我所期望的:

    Value: 0x7fff418f9d40
    

    我了解到,带有字符*的cout应该打印字符*的内容,而不是地址。那么为什么会发生这种情况呢?模板有问题吗?

    2 回复  |  直到 12 年前
        1
  •  3
  •   David Schwartz    12 年前

    char * 是一种特殊情况。对于任何其他指针,除非您自己实现了某种专门化,否则输出指针将输出该指针,而不是它所指向的内容。

        2
  •  -1
  •   Michał Górny    12 年前

    问题是,在你的情况下, T 是 char[40] 它已经是一个指针(相当于 char* ). 这意味着如果您使用 T* ,它变成 char** 这就是你想要打印的。由于它是指向指针的指针,因此应用指针的通用模板并打印地址。

    对于测试,您可以尝试打印:

    friend std::ostream& operator<<(std::ostream &out,
            const DataItem<T> &cDataItem) {
        out << *cDataItem.m_value;
        return out;
    }
    

    在这种情况下,您将取消引用指向原始值的指针,即 字符[40] 你应该得到预期的输出。


    而且,我认为你的 operator= 是错误的。自从你通过 T 并将其分配给 T* m_value ,隐式存储指向本地值的指针。你可能想要 吨* 同样在构造函数中。或者 T& 两种情况下的参考。