1. ホーム
  2. c++

[解決済み] C++ 削除された関数の使用エラー

2022-02-14 07:48:32

質問

削除された関数の使用エラーが多発しています。のポインタを変更したところ weighted_pointerunique_ptr . しかし、なぜこのエラーが発生するのかがわかりません。

は、その likeatree はDAG構造体であり、他の構造体または stdDeque をマスク値で指定する。

weightweighted_pointer があります。 mutable というキーワードは、セットの中のどこになるかは変わらないからです。

#include <deque>
#include <set>
#include <vector>
#include <iostream>
#include <algorithm>
#include <memory>
#include <chrono>

using namespace std;

struct likeatree{
    unsigned int mask : 3;
    void * a;
    void * b;
};

struct weighted_pointer{
    mutable int weight;
    unique_ptr<likeatree> ptr;
};

struct ptrcomp{
    bool operator()(const weighted_pointer & lhs, const weighted_pointer & rhs) {
        if(lhs.ptr->mask < rhs.ptr->mask)
            return true;
        if(lhs.ptr->mask > rhs.ptr->mask)
            return false;
        if(lhs.ptr -> a < rhs.ptr->a)
            return true;
        if(lhs.ptr->a > rhs.ptr->a)
            return false;
        return lhs.ptr->b < rhs.ptr->b;
    }
};

vector<likeatree *> treeVector;
deque<bool> stdDeque(3);
vector<vector<bool>> boolMatrix{{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0}};
set<weighted_pointer,ptrcomp> stdSet;

int main(){
    srand(time(NULL));
    likeatree * first_pointer = new likeatree{0,&input[0],nullptr};
    likeatree * second_pointer = first_pointer;
    unique_ptr<likeatree> tmp(first_pointer);
    weighted_pointer wp;
    wp.weight = 1;
    wp.pointer = move(tmp);
    stdSet.insert(move(wp));
    // I'd like to do it inline(or more but with variables that end of scope here), but this don't work. (And i don't keep a copy of the pointer)
    // stdSet.insert(move(weighted_pointer{1,move(make_unique<likeatree>(*new likeatree{0,&input[0],nullptr}))}));
    return 0;   
}

編集:問題のある一件のコードを変更した 編集:解決しました。make_uniqueを使用する際にdereferenceが欠落している。

解決するには?

構造体はこちらです。

<ブロッククオート
struct weighted_pointer{
    mutable int weight;
    unique_ptr<likeatree> ptr;
};

が含まれています。 std::unique_ptr . A std::unique_ptr はコピーできないので、あなたの全体の weighted_pointer もコピーできない。

あなたのコードには、コピーしようとする箇所が3箇所あり、それがご覧のようなエラーを引き起こしているのです。

bool operator()(const weighted_pointer lhs, const weighted_pointer rhs) {

でなければならない。

bool operator()(weighted_pointer const& lhs, weighted_pointer const& rhs) {

<ブロッククオート
stdSet.insert(tmp);

これは理論的には、次のように修正できます。

stdSet.insert(std::move(tmp));

ただし、その場合は tmp 同じループの中だけでなく、その下のループでもそうしているのです。そこで、まったく別の解決策を見つけなければなりません。例えば emplace . あるいは、コードを完全に再構築してください。

auto it = find_if(stdSet.begin(),stdSet.end(),[&](weighted_pointer temp){ return temp.ptr.get() == treeVector[i]; });

でなければならない。

auto it = find_if(stdSet.begin(),stdSet.end(),[&](weighted_pointer const& temp){ return temp.ptr.get() == treeVector[i]; });


VC++ 2013では std::move の修正では十分ではありません。構造体に明示的な移動コンストラクタを追加する必要があります。

struct weighted_pointer{
    mutable int weight;
    unique_ptr<likeatree> ptr;

    weighted_pointer() = default;
    weighted_pointer(weighted_pointer&& src) :
        weight(std::move(src.weight)),
        ptr(std::move(src.ptr))
    {
    }
};

VC++ 2015では、この問題が修正されています。詳細はこちら。 Visual Studio 2013 のデフォルトの Move コンストラクタ (Update 3)