c++ - 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&);
解决方案
通过operator<<
非常量左值引用获取正确的参数。这意味着临时变量不能被绑定到这个参数。
该key()
方法返回一个临时的。只有创建局部变量,才能把这个临时变量变成左值引用可以绑定的变量。
将运算符的参数更改为 aconst Key&
可以解决此问题,因为 const 左值引用可以绑定到临时对象。这应该是一个侵入性最小且安全的更改 - 如果输出运算符使用正在写入的对象的非常量功能,它只会无法工作,这本身就是一个很大的危险信号。但是,如果现有代码不是 const 正确的(即不修改其对象的成员函数没有一致地标记为const
),这可能会导致修复此类 const 正确性违规的长尾。
推荐阅读
- docker - docker run CLI - \ 后的空白产生`iinvalid reference format`
- c# - C# 回调函数不是从 C++ 代码调用的
- android - 类型“_Type”不是“颜色”类型的子类型
- android - 如何保持多边形的状态?
- javascript - node.js 获取返回 index.html 而不是 json 的 post 请求
- angular - NgRx:获取“您在预期流的位置提供了‘未定义’。” 调用完整动作时生效
- python - 有没有比使用 if/elif/elif 等更有效的方法?
- php - Laravel 7.x 在路由组中命名路由
- sql - 为什么 Oracle 在同一索引上使用范围扫描和快速全扫描?
- android - 视频编码器给出不一致的结果