【问题标题】:cout char* printing address instead of valuecout char* 打印地址而不是值
【发布时间】:2014-05-17 15:34:32
【问题描述】:

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

我了解到带有 char* 的 cout 应该打印 char* 的内容,而不是地址。那为什么会这样呢?模板有问题吗?

【问题讨论】:

  • 试试out &lt;&lt; *(cDataItem.m_value) ;
  • 除非Tcharconst char,否则cout 的行为是正确的。
  • 如果你认为T 应该是char 然后发布一个测试用例。到目前为止没有提供足够的信息。
  • 代码可以在Github 获得,但我想在这里发布的时间很长。 @MichaelWalz 它不起作用并打印了一个奇怪的字符串�s��。 @RSahu T 是 char[40]
  • @ranisalt:使用std::string 而不是char[40]。或使用std::vector&lt;char&gt;,或std::array&lt;char,40&gt;

标签: c++ templates pointers iostream cout


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这样我得到了更奇怪的值,甚至不代表字符,比如0� ��。这是编码的问题吗?
    • 我认为更多的是代码的问题。我刚刚更新了我的答案,指出operator= 似乎是错误的。尝试将编译器设置为更高的警告详细程度(例如 gcc 中的 -Wall -Wextra)。
    • 编译器输出没有错误。我注意到了一些事情,如果我在Interface::input() 方法中执行DataItem&lt;char[40]&gt; _(&amp;input); std::cout &lt;&lt; *_.value();,它会输出正确的值。过了这一点,代码中的任何地方都输出错误。我很困惑。
    猜你喜欢
    • 2020-08-09
    • 2016-02-26
    • 2013-07-22
    相关资源
    最近更新 更多