我正在使用一个成员函数,它只是将对象的内部方向设置为参数中给出的值:
void A::SetOrientation(float a[3]);
在另一堂课中,我有以下内容:
class B
{
public:
RestoreStateTo(A* const o_pA) const
private:
float d_orientation[3];
};
void
B::RestoreStateTo(A* const o_pA) const
{
o_pA->SetOrientation(d_orientation);
}
我得到以下编译器错误(使用Visual Studio 2010):
error C2664: 'void A::SetOrientation(float [])' : cannot convert parameter 1 from 'const float [3]' to 'float []'
我发现我可以避免o_pA->SetOrientation(const_cast<float *>(d_orientation));
的问题,但我想更好地掌握正在发生的事情。
我希望解释为什么数组参数转换为const
数组以及建议处理错误的正确方法?
答案 0 :(得分:2)
因为函数的原型void B :: RestoreStateTo(A * const o_pA)const表示你不会修改B的任何成员。 由于d_orientation是B的一个属性,因此它在此函数中是常量。
答案 1 :(得分:0)
你的SetOrientation函数应该包含一个const,
void A::SetOrientation(const float a[3]);
否则,A :: SetOrientation可能会修改你传入的数组。因为你有“B :: RestoreStateTo(A * const o_pA) const ”,这意味着编译器赢了不允许将指针传递给B :: d_orientation作为非const输入,因为A :: SetOrientation不保证不修改它。
答案 2 :(得分:-1)
您已声明const
成员函数,因此this
的所有成员将在该函数内被视为const
。因此d_orientation
被视为const
并不奇怪。
这个原则使得此代码非法:
const B* p = ...;
p->d_orientation[0] = 0.0f; // error, assigning member of `const` object