我正在使用 Solaris 10 上的旧 Solaris 编译器处理一些遗留代码(这里没有新奇特的 C++0x ;-)
-bash-3.2$ CC -V
CC: Sun C++ 5.12 SunOS_sparc 2011/11/16
我有一个带有迭代器的第 3 方字典类
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&);
最佳答案
operator<<
通过非常量左值引用获取其正确的参数。这意味着临时对象不能绑定(bind)到这个参数。
key()
方法返回一个临时的。只有创建局部变量,才能将这个临时变量变成左值引用可以绑定(bind)的变量。
将运算符的参数更改为 const Key&
解决了这个问题,因为 const 左值引用可以绑定(bind)到临时对象。这应该是一个侵入性最小且安全的更改——只有当输出运算符使用正在写入的对象的非常量功能时它才会失败,这本身就是一个大危险信号。但是,如果现有代码不是常量正确的(即,不修改其对象的成员函数未始终标记为 const
),这可能会导致修复此类常量正确性违规的过程很长。
关于C++ ostream_withassign with << operator 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50522637/