即使经过多年,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 *')
我可以将循环体更改为计数器+计数器,它仍然会失败并显示相同的错误消息。
在引用和指针之间隐式转换是否应该足够聪明? 我在这里错过了一些小事吗?
答案 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;