首页 > 解决方案 > C++ ostream_withassign 与 << 运算符编译错误

问题描述

我正在使用 Solaris 10 上的旧 Solaris 编译器处理一些遗留代码(这里没有新奇的 C++0x ;-)

-bash-3.2$ CC -V

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

我有一个带有迭代器的 3rd 方字典类

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()返回 a K(不是参考),这两个片段非常相似。谁能让我知道我刚刚碰到了 C++ 的哪个奇怪的角落?

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

标签: c++solaris

解决方案


通过operator<<非常量左值引用获取正确的参数。这意味着临时变量不能被绑定到这个参数。

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

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


推荐阅读