编译器似乎改变了我的const参数

时间:2016-10-20 20:37:37

标签: c++ templates const

我正在尝试使用我的模板类的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

2 个答案:

答案 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,即一个常量指针。