删除隐式分配运算符以进行矢量擦除?

问题描述 投票:0回答:1

我有两个向量,我希望将它们进行比较并删除重复项。如果我有两个向量vecAvecB,如果它们出现在vecA中,我想从vecB中删除元素。具体来说,我希望将vecA传递给方法并在该方法内进行变异。

#include <iostream>
#include <string>
#include <vector>

class M {
    private:
        const char COL[8] = {'a','b','c','d','e','f','g','h'};
    public:
        int aC, aR, dC, dR;
        M(int a, int b, int c, int d) {
            aC = a; aR = b; dC = c; dR = d;
        }
        bool operator==(M &m) {
            bool sameC = (aC == m.aC && dC == m.dC);
            bool sameR = (aR == m.aR && dR == m.dR);
            return (sameC && sameR);
        }
};

class B {
    public:
        std::vector<M> foo() {
            std::vector<M> vec;
            vec.push_back(M(1, 3, 2, 4));
            vec.push_back(M(1, 2, 3, 4));
            return vec;
        }
};

class K {
    public:
        void boo(B* b) {
            std::vector<M> vec;
            vec.push_back(M(1, 2, 3, 4));
            vec.push_back(M(2, 3, 4, 5));
            std::cout << "Size before: " << vec.size() << "\n";
            bar(b, vec);
            std::cout << "Size after: " << vec.size() << "\n";
        }
        void bar(B* b, std::vector<M> &v) {
            std::vector<M> vec = b->foo();
            for (unsigned int i = 0; i < v.size(); i++) {
                for (unsigned int j = 0; j < vec.size(); j++) {
                    if (v[i] == vec[j]) { v.erase(v.begin() + i); }
                }
            }
        }
};

int main()
{
    B* baz;
    K var;
    var.boo(baz);
}

我收到M& operator=(const M&) is implicitly deleted because the default definition would be ill-formed的错误。

问题代码是const char数组;删除这段代码,其他所有工作都很好,但是为什么呢?

此代码的预期输出将是:

Size before: 2
Size after: 1

为什么仍然需要迭代的赋值运算符(对于erase,并且有解决方法?在这种情况下,“默认赋值运算符”将是什么?

c++ vector operator-overloading assignment-operator
1个回答
2
投票

class M具有一个非静态成员变量COL,它是const事物的数组,因此编译器无法复制该数组的内容。

想必您想制作COL static,所以它不是每个M对象的子对象吗?

© www.soinside.com 2019 - 2024. All rights reserved.