繁体   English   中英

运算符+混淆(指针与参考)

[英]operator+ confusion (pointer vs. reference)

即使几年后,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 *')

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

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

在引用和指针之间隐式转换是否足够聪明?

可以,但是不是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);

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

附带说明一下,您确定所有这些指针和虚函数确实是必需的吗?

这里没有隐式转换。

您将必须提供要使用的确切重载。

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

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

*iniCounter = *iniCounter + *counter;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM