【问题标题】:Compiler seeming to change my const parameter [duplicate]编译器似乎改变了我的 const 参数 [重复]
【发布时间】:2016-10-20 20:37:37
【问题描述】:

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

    // 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

【问题讨论】:

  • 这个问题不是重复的,因为导致编译器错误的问题没有被链接的线程之一解决。导致错误的不是Joint *Joint * const 的转换,而是无效的Joint const *Joint * 的转换。后一个问题与任何其他(非指针)类型没有什么不同。

标签: c++ templates constants


【解决方案1】:

您的类模板DynamicArrayE 类型推导出为Joint *,并且在成员函数Contains 中您基本上添加了const。现在,正如 cmets 中提到的并且已经由编译器错误指出的那样,这不会导致 const Joint*(与 Joint const* 相同),而是导致 Joint * const - 添加 const 确实不对应于文本替换,您只需将 E 替换为指针类型。

但是,这里的问题不在于将const 添加到函数Contains 采用的指针类型,因为允许这种转换。问题在于您将 const 指针传递给函数 Contains,但它实际上需要一个非 const 指针——这是不允许的从 const Joint*Joint * 的转换。

这就是为什么删除Contains(const E) 中的const 不能解决这个特定问题的原因。尽管如此,我还是强烈建议这样做,因为通过 const-value 获取参数几乎没有用处。

相反,正如您已经编写的那样,您需要删除函数AnimatesJoint(const Joint* pJoint) 中的const

【讨论】:

    【解决方案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,即一个常量指针。

    【讨论】:

    • 你知道类型推导是如何工作的吗?
    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 2012-10-10
    • 2019-11-11
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多