类没有合适的运算符 - >

时间:2013-12-06 21:22:01

标签: c++ visual-studio-2010 map operator-overloading

我正在尝试实现无锁地图,我遇到了一个问题。

在我的迭代器类中,我实现了一个operator->来自由获取firstsecond

_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->呢?

1 个答案:

答案 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;
}