我正在使用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.
但这个版本有效:
DictIterator iterator(theDictionary);
while(iterator())
{
Key key(iterator.key());
cout << key;
}
显然我有一个解决方法,但我认为,因为DictIterator.key()
返回K
(不是参考),这两个片段非常相似。任何人都可以让我知道我刚刚碰到的C ++的奇怪角落吗?
编辑:要回复评论,<<
会被覆盖ostream& operator(ostream &, Key&);
答案 0 :(得分:3)
operator<<
通过非const左值引用获取其正确的参数。这意味着临时性不能与这种论点联系在一起。
key()
方法返回临时值。只有通过创建局部变量,才能将此临时变为左值引用可以绑定的变量。
将运算符的参数更改为const Key&
可以解决此问题,因为const限值引用可以绑定到临时值。这应该是一种微创和安全的更改 - 如果输出操作符使用了正在写入的对象的非const功能,它本身只能是一个很大的红旗,它只能失败。但是,如果现有代码不是const-correct(即不修改其对象的成员函数不一致地标记为const
),这可能导致修复此类const-correctness违规的长尾。