1

我正在尝试实现一类数字向量。我正在使用类似于 STL 向量的 Qt 模板 QVector

typedef float ArithmeticF;
typedef QVector<ArithmeticF> VectorFloat;

class VectorF : public VectorFloat
{
/// appends the rightSide to the end
VectorF& operator << (const VectorF& rightSide);
}

让我困惑的是

VectorF& VectorF::operator << (const VectorF& rightSide)
{
static_cast<VectorFloat>(*this) <<  static_cast<VectorFloat>(rightSide);
return *this;
}

根本不起作用。我试图逐行调试它,并且 VectorFloat::operator<< 根本没有被调用。没有错误,程序编译并运行,但什么也不做。但是,这有效:

VectorF& VectorF::operator << (const VectorF& rightSide)
{
VectorFloat a = static_cast<VectorFloat>(*this);
VectorFloat b = static_cast<VectorFloat>(rightSide);
a << b;
*this = VectorF(a);
return *this;
}

我只是好奇为什么会这样。我试图深入研究 static_cast 命令,但我无法弄清楚。

请帮我。

4

1 回答 1

3

您正在转换为 value type VectorFloat,它会复制您的*this对象并将<<运算符应用于它。这个临时对象会被立即销毁,因此无法观察到任何效果。

您应该改为使用参考VectorFloat&

static_cast<VectorFloat&>(*this) <<  static_cast<VectorFloat>(rightSide);

第二个例子有效的事实很容易解释。您将复制的对象存储在a变量中,并且您正在VectorF基于此修改后的副本重建您的对象。在此过程中进行了太多操作(转换为VectorFloat、转换回VectorF、分配为*this),但实际上它是有效的。

于 2012-01-01T10:50:51.580 回答