C++ 编译器似乎要更改我的常量参数
我试图使用模板类的Contains()方法,但遇到了一个奇怪的参数转换错误 错误C2664:'bool DynamicArray::Contains(const E)const' :无法将参数1从'const Joint*'转换为'Joint*const' 带E=接头C++ 编译器似乎要更改我的常量参数,c++,templates,constants,C++,Templates,Constants,我试图使用模板类的Contains()方法,但遇到了一个奇怪的参数转换错误 错误C2664:'bool DynamicArray::Contains(const E)const' :无法将参数1从'const Joint*'转换为'Joint*const' 带E=接头 转换将丢失限定符 下面是相关的模板类代码 template <class E> class DynamicArray { bool Contains (const E element) const;
转换将丢失限定符 下面是相关的模板类代码
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...
}
ASMState.h中的相关模板类代码
class ASMState
{
DynamicArray<Joint*> m_animatedJoints;
// Other members...
bool AnimatesJoint(const Joint* pJoint) const;
// Other methods...
};
类状态
{
DynamicCarray m_动画关节;
//其他成员。。。
bool AnimatesJoint(const Joint*pJoint)const;
//其他方法。。。
};
如果我像这样删除AnimatesJoint函数签名中的常量,bool ASMState::AnimatesJoint(Joint*pJoint)const
,那么代码将编译。如果可以的话,我想保持常量不变,但我不知道为什么这个参数似乎与我写的有所不同。也就是说,根据编译器,从const Joint*
到Joint*const
我正在使用Visual Studio 2013 Express似乎
bool Contains(const E element)const
需要类型为const E
的输入,而在
return m_animatedJoints.Contains(pJoint);
您正在传递类型为const*
的输入,即指针。也许解决方案是将这一行更改为:
return m_animatedJoints.Contains(*pJoint);
我猜您得到的错误是因为编译器试图将输入
pJoint
asconst E
whereE=…*const
,即常量指针。似乎布尔包含(const e元素)const
需要类型为const e
的输入,而在
return m_animatedJoints.Contains(pJoint);
您正在传递类型为const*
的输入,即指针。也许解决方案是将这一行更改为:
return m_animatedJoints.Contains(*pJoint);
我猜您得到的错误是因为编译器试图将输入
pJoint
asconst E
whereE=…*常量
,即常量指针。您的类模板DynamicArray
将类型e
推断为Joint*
,并且在成员函数包含的中基本上添加了const
。现在,正如注释中提到的,并且编译器错误已经指出的,这不会导致常量Joint*
(与Joint const*
相同),但是对于Joint*const
——添加const
并不对应于文本替换,您只需将E
替换为指针类型
但是,这里的问题不是将常量添加到函数Contains
所采用的指针类型中,因为此强制转换是允许的。问题在于,您将常量指针传递给函数Contains
,但实际上它需要一个非常量指针——不允许从常量Joint*
转换为Joint*
这就是为什么删除Contains(const E)
中的const
无法解决此特定问题的原因。尽管如此,我还是强烈建议这样做,因为按常量值获取参数几乎没有任何用处
相反,正如您已经编写的,您需要删除函数AnimatesJoint(const Joint*pJoint)
中的const
,您的类模板dynamiccarray
将类型E
推断为Joint*
,并且在成员函数包含的中,您基本上向其添加了const
。现在,正如注释中提到的,并且编译器错误已经指出的,这不会导致常量Joint*
(与Joint const*
相同),但是对于Joint*const
——添加const
并不对应于文本替换,您只需将E
替换为指针类型
但是,这里的问题不是将常量添加到函数Contains
所采用的指针类型中,因为此强制转换是允许的。问题在于,您将常量指针传递给函数Contains
,但实际上它需要一个非常量指针——不允许从常量Joint*
转换为Joint*
这就是为什么删除Contains(const E)
中的const
无法解决此特定问题的原因。尽管如此,我还是强烈建议这样做,因为按常量值获取参数几乎没有任何用处
相反,正如您已经编写的,您需要删除函数AnimatesJoint(const Joint*pJoint)
中的const
,您知道类型推断是如何工作的吗?您知道类型推断是如何工作的吗?问题不是重复的,因为导致编译器错误的问题不是由一个链接线程解决的。导致错误的不是Joint*
到Joint*const
的转换,而是无效的Joint-const*
到Joint*
的转换。后一个问题与任何其他(非指针)类型没有区别。这个问题不是重复的,因为导致编译器错误的问题不是由一个链接线程解决的。导致错误的不是Joint*
到Joint*const
的转换,而是无效的Joint-const*
到Joint*
的转换。后一个问题与任何其他(非指针)类型没有区别。