C++ ostream_withassign with << operator 编译错误

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

我有一个带有迭代器的第 3 方字典 class

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.

但是这个版本有效:

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

显然我有一个解决方法,但我认为由于 DictIterator.key() returns a K(不是参考),这两个片段非常相似。谁能告诉我我刚刚遇到了 C++ 的哪些奇怪角落?

编辑:要回答评论,<< 被覆盖 ostream& operator(ostream &, Key&);

operator<< 通过非常量左值引用获取其右参数。这意味着临时对象不能绑定到这个参数。

key()方法returns临时。只有创建局部变量,才能把这个临时变量变成左值引用可以绑定的变量。

将运算符的参数更改为 const Key& 可以解决此问题,因为 const 左值引用可以绑定到临时对象。这应该是一个侵入性最小且安全的更改——只有当输出运算符使用正在写入的对象的非常量功能时它才会失败,这本身就是一个大危险信号。但是,如果现有代码不是 const 正确的(即不修改其对象的成员函数未始终标记为 const),这可能会导致修复此类 const 正确性违规的长尾。