首页 文章

cout char *打印地址而不是值

提问于
浏览
1

在模板类中,我使用以下内容重载了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

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

  • 2

    问题是在你的情况下, Tchar[40] ,它已经是一个指针(相当于 char* ) . 这意味着如果您使用 T* ,它将变为 char** 并且's what you are trying to print. Since it'是指向指针的指针,指针的通用模板将被应用并打印地址 .

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

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

    在这种情况下,您将取消引用指向原始值的指针,即 char[40] ,您应该获得预期的输出 .


    另外,我认为你的_2560284错了 . 由于您将 T 传递给它,并将其分配给 T* m_value ,因此您隐式存储指向本地值的指针 . 您可能希望在构造函数中同样使用 T* . 或两种情况下的 T& 参考 .

相关问题