簡體   English   中英

cout char *打印地址而不是值

[英]cout char* printing address instead of value

在模板類中,我用以下方法重載了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 *的內容,而不是地址。 為什么會這樣呢? 模板有問題嗎?

char *是特例。 對於任何其他指針,除非您具有某種專長,否則您自己實現,輸出指針將輸出該指針,而不是其指向的指針。

問題是,在您的情況下, 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&參考。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM