2012-01-06 90 views
0

即使经过多年的C++是混淆了地狱了我..我 类实现运营商+混乱(指针与参考)

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

virtual CStatCounter operator+(const CStatCounter& rhs); 

而且我保持

vector<CStatCounter*> mStatistics 

别的地方。现在我想要做的就是积累所有的价值。 在由STD被嘲笑后::积累,我切换到一个简单的循环滚我自己,仍然没有运气:

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

编译器(4.2的Xcode /铛)抱怨

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

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

不应该足够聪明地隐式转换参考和指针吗? 我在这里错过了一些微不足道的东西吗?

+2

我很困惑,为什么你加符返回'bool',而不是一个'CStatCounter' – Hoons 2012-01-06 17:25:04

+0

周杰伦嗨,不回答你的问题,但如果你使用boost :: ptr_vector,而不是一个std ::指针的矢量你将迭代引用而不是指针。本来可以避免这种情况。 – Dennis 2012-01-06 17:25:56

+0

因为..我太麻烦复制&粘贴!!!!D'OH!感谢那。应该返回一个CStatCounter当然... – Jay 2012-01-06 17:30:41

回答

4

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

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

我在这里错过了一些微不足道的东西吗?

提领:

*iniCounter = *iniCounter + *counter; 

顺便说一句,你仍然可以使用std ::积累,你只需要一个自定义的二进制操作,像这样:

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

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

*叹*我真的希望编译器,可以是聪明的,如果 - 你做...回答;-) – Jay 2012-01-06 17:20:18

3

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

在附注中,您确定所有这些指针和虚拟信息都是非常必要的吗?

+0

这是一群派生类的基类保持实际的具体统计! – Jay 2012-01-06 17:18:17

+0

就柜台而言 - 恨STL一直在抄袭我的东西。在这个微不足道的场景(每个实例有一个int或double成员)可能没有什么可担心的,尽管.. – Jay 2012-01-06 17:19:10

+0

如果operator +返回一个bool,这个工作吗? – antlersoft 2012-01-06 17:25:06

2

没有隐含的转换。

您将不得不提供您准确使用的重载。

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

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

*iniCounter = *iniCounter + *counter; 
+0

有时我讨厌C++。不管怎么说,还是要谢谢你。 – Jay 2012-01-06 17:21:25

+0

@Jay:对我来说,它通常是一个爱恨关系,大部分时间:) – 2012-01-06 17:23:21