error C2839: 重载的“operator ->”的无效返回类型"*const*"

今天在使用vector的时候碰到了这个错误,出错的代码书写形式
std::vector<BlockBase*>::const_iterator iter = BlockBufferList.begin();
for (; iter != BlockBufferList.end(); ++iter)
{
    *iter->Clear();
}
BlockBase 的形式如下
class BlockBase :public StreamBase
{
public:
    BlockBase() //!< 构造函数,初始化成员变量
    {
    }
    virtual ~BlockBase() //!< 析构函数,所有数据清零
    {
    }
    virtual void Clear() = 0;
};
在查阅资料之后发现需要将
*iter->Clear();
改写为
(*iter)->Clear();

问题就得以解决了。  

错误分析:  
在VS的 官方描述中这样描述此错误:"-> 运算符必须返回一个类、结构或联合,或者返回对其中之一的引用。"

虽然我没能在网上找到合理的解释,但我认为造成这样的原因在于:

当你不加括号的时候,编译器会存在不明确的转换,如: 

*iter->Clear();

是应该理解为

(*iter)->Clear();

还是理解为

*(iter->Clear());

若是后者这显然vector中没有`Clear()`函数,就会触发

error C2039: “clear”: 不是“std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<obitsdk::BlockBase *>>>”的成员

猜你喜欢

转载自blog.csdn.net/sinat_34130812/article/details/80082689