我正在尝试使用我的模板类的Contains()方法,但我得到一个奇怪的参数转换错误。
错误C2664:' bool DynamicArray :: Contains(const E)const' :无法转换来自' const Joint *'的参数1到' Joint * const' E =联合
转换失去限定符
以下是相关的模板类代码。
template <class E>
class DynamicArray
{
bool Contains (const E element) const;
// Other code...
};
template <class E>
bool DynamicArray<E>::Contains(const E element) const
{
// Other code...
}
对Contains方法的调用是在这里完成的
bool ASMState::AnimatesJoint(const Joint* pJoint) const
{
return m_animatedJoints.Contains(pJoint);
}
ASMState.h中的相关模板类代码
class ASMState
{
DynamicArray<Joint*> m_animatedJoints;
// Other members...
bool AnimatesJoint(const Joint* pJoint) const;
// Other methods...
};
如果我删除AnimatesJoint函数签名中的const,如bool ASMState::AnimatesJoint(Joint* pJoint) const
,那么代码就会编译。如果可以的话,我想保留const,但我不知道为什么这个参数似乎与我写的有所不同。也就是说,根据编译器,从const Joint *
到Joint *const
。
我正在使用Visual Studio 2013 Express
答案 0 :(得分:1)
您的班级模板DynamicArray
会将E
类型推断为Joint *
,而在成员函数Contains
中,您基本上会为其添加const
。现在,正如评论中提到的并且编译器错误已经说明的那样,这不会导致const Joint*
(与Joint const*
相同),而是导致Joint * const
- 添加const
并不对应于您只需用指针类型替换E
的文本替换。
但是,这里的问题不在于将const
添加到函数Contains
所采用的指针类型,因为允许此强制转换。问题在于您将const指针传递给函数Contains
,但它实际上期望一个非常量指针 - 它是从const Joint*
到Joint *
的强制转换,不允许。
这就是删除const
中的Contains(const E)
无法解决此特定问题的原因。不过我强烈建议,因为通过const-value获取参数几乎没用。
相反,正如您已经写过的那样,您需要删除函数const
中的AnimatesJoint(const Joint* pJoint)
。
答案 1 :(得分:-2)
似乎bool Contains (const E element) const
期望输入类型const E
,而
return m_animatedJoints.Contains(pJoint);
您正在传递类型const E *
的输入,换句话说是指针。也许解决方案是将此行更改为:
return m_animatedJoints.Contains(*pJoint);
我猜你得到的错误是因为编译器试图将输入pJoint
作为const E
传递给E = ... * const
,即一个常量指针。