簡體   English   中英

C ++ ostream_withassign與<<運算符編譯錯誤

[英]C++ ostream_withassign with << operator compile error

我正在使用Solaris 10上的舊Solaris編譯器處理一些遺留代碼(這里沒有新的C ++ 0x ;-)

-bash-3.2 $ CC -V

CC:Sun C ++ 5.12 SunOS_sparc 2011/11/16

我有一個帶有迭代器的第三方字典類

template<K, V>
class DictIterator
{
    public:
        DictIterator(TheDictClass<K, V>& collection);
        K key() const;
        V value() const;
        // advance the iterator. return true if iterator points to a valid item
        bool operator()();
    ...
};

我的代碼應該遍歷字典中的每個項目但是有一個我無法解釋的編譯錯誤:

DictIterator iterator(theDictionary);
while(iterator())
{
    cout << iterator.key(); 
}

"filename.cc", line 42: Error: The operation "ostream_withassign<<Key" is illegal.失敗"filename.cc", line 42: Error: The operation "ostream_withassign<<Key" is illegal.

但是這個版本有效:

DictIterator iterator(theDictionary);
while(iterator())
{
    Key key(iterator.key());
    cout << key; 
}

顯然我有一個解決方法,但我認為,因為DictIterator.key()返回一個K (不是引用),這兩個片段非常相似。 任何人都可以讓我知道我剛剛碰到的C ++奇怪的角落嗎?

編輯:要回答評論, <<被覆蓋ostream& operator(ostream &, Key&);

operator<<通過非const左值引用獲取其正確的參數。 這意味着臨時性不能與這個論點綁定。

key()方法返回一個臨時的。 只有通過創建局部變量,才能將此臨時變為左值引用可以綁定的變量。

將運算符的參數更改為const Key&解決此問題,因為const左值引用可以綁定到臨時值。 這應該是一種微創和安全的更改 - 如果輸出操作符使用了正在寫入的對象的非const功能,它本身只能是一個很大的紅旗,它只能失敗。 但是,如果現有代碼不是const-correct(即不修改其對象的成員函數不一致地標記為const ),這可能會導致修復此類const-correctness違規的長尾。

暫無
暫無

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

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