我正在尝试实现一类数字向量。我正在使用Qt模板QVector,类似于STL向量
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&lt;&lt;根本没有被召唤。没有错误,程序编译并运行,但什么都不做。然而,这有效:
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命令,但我无法弄明白。
请帮帮我。
答案 0 :(得分:3)
您正在转换为值类型VectorFloat
,它会复制您的*this
对象,并将<<
运算符应用于该对象。这个临时物体被迅速摧毁,因此无法观察到任何影响。
您应该转而使用引用VectorFloat&
:
static_cast<VectorFloat&>(*this) << static_cast<VectorFloat>(rightSide);
第二个例子有效的事实很容易解释。您将复制的对象存储在a
变量中,并且您正在根据此修改后的副本重建VectorF
。在整个过程中有太多的操作(转换为VectorFloat
,转换回VectorF
,转让给*this
),但实际上它有效。