operator + confusion(指针与参考)

时间:2012-01-06 17:14:25

标签: c++ xcode

即使经过多年,C ++也让我感到困惑。 我的班级实现了

virtual CStatCounter& operator= (CStatCounter const& inSC);

virtual CStatCounter operator+(const CStatCounter& rhs);

我正在保持

vector<CStatCounter*> mStatistics 

其他地方。现在我所要做的就是积累所有价值观。 在被std :: accumulate嘲笑之后,我已经切换到一个简单的循环滚动,仍然没有运气:

CStatCounter *iniCounter = new CStatCounter(0);
BOOST_FOREACH (CStatCounter *counter, mStatistics)
{
   iniCounter = iniCounter+counter;
}

编译器(Xcode 4.2 / clang)抱怨

Invalid operands to binary expression ('CStatCounter *' and 'CStatCounter *')

我可以将循环体更改为计数器+计数器,它仍然会失败并显示相同的错误消息。

在引用和指针之间隐式转换是否应该足够聪明? 我在这里错过了一些小事吗?

3 个答案:

答案 0 :(得分:4)

  

在引用之间隐式转换不应该足够聪明   和指针?

可能,但那不是C ++,不是吗?当你可以为每个可想到的操作数组合重载运算符时,做出这样的假设是不安全的。

  

我在这里错过了一些小事吗?

解引用:

*iniCounter = *iniCounter + *counter;

顺便说一下,你仍然可以使用std :: accumulate,你只需要一个自定义二进制操作,如下所示:

CStatCounter MyAddFunc(const CStatCounter & lhs, const CStatCounter * rhsp)
{
    return lhs + *rhsp;
}

*iniCounter = std::accumulate(mStatistics.begin(), mStatistics.end(),
                              *iniCounter, MyAddFunc);

答案 1 :(得分:3)

*iniCounter = *iniCounter + *counter;怎么样?

另外,你确定所有那些指针和虚拟对象都是必要的吗?

答案 2 :(得分:2)

这里没有隐式转换。

您必须提供您使用的精确重载。

virtual bool operator+(const CStatCounter* rhs);
virtual CStatCounter& operator= (CStatCounter const* inSC);

或修改您的代码以匹配您提供的重载。

*iniCounter = *iniCounter + *counter;