c++ 为什么编译器声明类方法已删除?

wdebmtf2  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(155)

我试图使一个类,其中包括std::pair容器,见下面的代码。

  • 为什么编译器声明类方法已删除?
  • 如何解决此问题?
template <typename Kty_, typename Dty_>
class TreeNode {
public:

    // tags:
    using usI             = unsigned short int;                    
    using value_type      = std::pair<const Kty_, Dty_>;           
    using pointer         = value_type*;  
    using reference       = value_type&; 
    using const_reference = const value_type&; 


    TreeNode(
        const_reference             pairValue,
        usI                         height  = 0,
        TreeNode<const Kty_, Dty_> *parent  = nullptr,
        TreeNode<const Kty_, Dty_> *left    = nullptr,
        TreeNode<const Kty_, Dty_> *right   = nullptr
    ) {
        left_       = left;
        parent_     = parent;
        right_      = right;
        pairValue_  = pairValue;  // 48 // Overload resolution selected deleted operator '=' ​clang:ovl_deleted_oper
        height_     = height;
    }
protected:
    TreeNode<const Kty_, Dty_> *left_;
    TreeNode<const Kty_, Dty_> *parent_;
    TreeNode<const Kty_, Dty_> *right_;
    
    value_type                  pairValue_;
    usI                         height_;
};
  • 有一组examples调用此问题:
    • 示例:未初始化的数据成员:* 它对我不起作用,因为我不知道如何用默认值初始化Kty_ & Dty_
    • 示例:引用和常量数据成员:* 我已尝试删除某些const关键字指定,但没有帮助
    • 示例:Movable删除隐式副本:* 我认为不是我的情况
    • 示例:删除的间接基成员:* 我认为不是我的情况
    • 示例:变量和volatile成员:* 我认为不是我的情况
5uzkadbs

5uzkadbs1#

为什么编译器声明一个类方法被删除了?
由于无法向const成员赋值,因此value_type pairValue_;包含常量成员。
如何解决此问题?
正确初始化const成员。
不能在构造函数体中赋值给常量成员,这是你正在做的,只是将“初始化”(或者更确切地说是所有的)移到初始化列表中。

TreeNode(const_reference pairValue, usI height = 0,
         TreeNode<const Kty_, Dty_> *parent = nullptr,
         TreeNode<const Kty_, Dty_> *left = nullptr,
         TreeNode<const Kty_, Dty_> *right = nullptr)
    : left_(left),
      parent_(parent),
      right_(right),
      pairValue_(pairValue),
      height_(height) {}

相关问题