C++ ostream_withassign with << operator 编译错误
C++ ostream_withassign with << operator compile error
我正在 Solaris 10 上使用旧的 Solaris 编译器处理一些遗留代码(这里没有新奇特的 C++0x ;-)
-bash-3.2$ CC -V
CC: Sun C++ 5.12 SunOS_sparc 2011/11/16
我有一个带有迭代器的第 3 方字典 class
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()
returns a K
(不是参考),这两个片段非常相似。谁能告诉我我刚刚遇到了 C++ 的哪些奇怪角落?
编辑:要回答评论,<<
被覆盖 ostream& operator(ostream &, Key&);
operator<<
通过非常量左值引用获取其右参数。这意味着临时对象不能绑定到这个参数。
key()
方法returns临时。只有创建局部变量,才能把这个临时变量变成左值引用可以绑定的变量。
将运算符的参数更改为 const Key&
可以解决此问题,因为 const 左值引用可以绑定到临时对象。这应该是一个侵入性最小且安全的更改——只有当输出运算符使用正在写入的对象的非常量功能时它才会失败,这本身就是一个大危险信号。但是,如果现有代码不是 const 正确的(即不修改其对象的成员函数未始终标记为 const
),这可能会导致修复此类 const 正确性违规的长尾。
我正在 Solaris 10 上使用旧的 Solaris 编译器处理一些遗留代码(这里没有新奇特的 C++0x ;-)
-bash-3.2$ CC -V
CC: Sun C++ 5.12 SunOS_sparc 2011/11/16
我有一个带有迭代器的第 3 方字典 class
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()
returns a K
(不是参考),这两个片段非常相似。谁能告诉我我刚刚遇到了 C++ 的哪些奇怪角落?
编辑:要回答评论,<<
被覆盖 ostream& operator(ostream &, Key&);
operator<<
通过非常量左值引用获取其右参数。这意味着临时对象不能绑定到这个参数。
key()
方法returns临时。只有创建局部变量,才能把这个临时变量变成左值引用可以绑定的变量。
将运算符的参数更改为 const Key&
可以解决此问题,因为 const 左值引用可以绑定到临时对象。这应该是一个侵入性最小且安全的更改——只有当输出运算符使用正在写入的对象的非常量功能时它才会失败,这本身就是一个大危险信号。但是,如果现有代码不是 const 正确的(即不修改其对象的成员函数未始终标记为 const
),这可能会导致修复此类 const 正确性违规的长尾。