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

标签 c++ solaris

我正在使用 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/

相关文章:

c++ - 查找 C++ 元素的正则表达式?

c++ - 如何将 cv::Mat 转换为 cv::Rect

c++ - GCC 中的宏有效但在 Solaris 中编译器失败?

c++ - Solaris 进程如何读取自己的符号表?

linux - 如何在 linux redhat 中列出池?

c++ - 修改 unordered_set 中的值

c++ - std::deque<char> 上的简单插入-删除-插入给出了奇怪的结果

c++ - WMI 返回类型转换

perl - 在perl中读取文件时删除特殊字符

java - 如何减少JVM虚拟内存的使用?