我正在尝试实现无锁地图,我遇到了一个问题。
在我的迭代器类中,我实现了一个operator->
来自由获取first
和second
:
_t_iterator_return<_Kty, _Ty> operator->()
{
_t_iterator_return<_Kty, _Ty> tmp((int&)Cur->getKey(), Cur->getValue());
return tmp;
}
这是:
template <class _Kty, class _Ty>
struct _t_iterator_return
{
_Kty& first; // key
_Ty& second; // val
_t_iterator_return(_Kty& k, _Ty& v) : first(k), second(v) {}
};
似乎规范不是吗?但在我main()
这个:
for(LFMap<int, stringc>::iterator it = m.begin(); !it.end(); ++it)
fprintf(mres, "K: %7d V: %s\n", it->first, it->second.c_str());
导致编译时错误:error C2819: type 'lightforce::core::LFMap<_Kty,_Ty>::_t_iterator_return<_Kty,_Ty>' does not have an overloaded member 'operator ->'
然而,这段代码:
for(LFMap<int, stringc>::iterator it = m.begin(); !it.end(); ++it)
fprintf(mres, "K: %7d V: %s\n", it.operator->().first, it.operator->().second.c_str());
已经成功编译并且工作得很好!为什么->
无效,operator->
呢?
答案 0 :(得分:3)
C ++11§13.5.6[over.ref]第1段陈述:
...如果
x->m
存在,并且选择了运算符,则表达式(x.operator->())->m
将被解释为x
类型对象T
T::operator->()
作为重载解析机制(13.3)的最佳匹配函数。
由于您从operator->
- _t_iterator_return<_Kty, _Ty>
返回的类型没有operator ->
,因此无法取消引用。
将operator ->
添加到_t_iterator_return
只返回this
:
_t_iterator_return* operator->()
{
return this;
}