[解決済み] C++ 削除された関数の使用エラー
質問
削除された関数の使用エラーが多発しています。のポインタを変更したところ
weighted_pointer
を
unique_ptr
. しかし、なぜこのエラーが発生するのかがわかりません。
は、その
likeatree
はDAG構造体であり、他の構造体または
stdDeque
をマスク値で指定する。
は
weight
の
weighted_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)
関連
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む