初学者のため、初歩的なミスやわかりづらいところ等がありましたらすみません。
Microsoft Visual Studio Community 2022 (64 ビット) - Current
Version 17.3.2
において、C++でプログラムを書いているのですが、メモリリークが気になり、shared_ptrを導入してみたところ、
以前はコンパイルが通り、プログラムも動作していたところが、コンパイルエラーになりました。
該当のソースコード
※型、変数の名前は変更しています
class Base{...}; //基底クラス
class Derived1 : public Base{...}; //派生クラス1
class Derived2 : public Base{...}; //派生クラス2
//派生クラスを基底クラスポインタで格納するvectorコンテナ
//std::vector<Base*>からstd::vector<std::shared_ptr<Base>>に変更
//要素はいくつか入っている
std::vector<std::shared_ptr<Base>> Container = {...};
//thisはDerived1やDerived2などの派生クラスポインタ
//vectorコンテナを探して、thisが無ければ、vectorコンテナに格納する
std::vector<std::shared_ptr<Base>>::iterator iter =
std::find(Container.begin(),Container.end().this);
if (iter == Container.end())
{
Container.emplace_back(this);
}
発生している問題・エラーメッセージ
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー C2678 二項演算子 '==': 型 'std::shared_ptr<Base>' の左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。
メッセージ 'bool std::operator ==(std::thread::id,std::thread::id) noexcept' [引数依存の照合を使用して検出] の可能性があります
メッセージ または 'bool operator ==(const GUID &,const GUID &)' [引数依存の照合を使用して検出] の可能性があります
メッセージ または 'ビルトイン C++ 演算子==(_Ty, _Ty)'
メッセージ 引数リスト '(std::shared_ptr<Base>, const _Ty)' を一致させようとしているとき
メッセージ コンパイル対象の関数 テンプレート インスタンス化 '_InIt std::_Find_unchecked<std::shared_ptr<Base>,_Ty>(_InIt,const _InIt,const _Ty &)' のリファレンスを確認してください
メッセージ コンパイル対象の関数 テンプレート インスタンス化 '_InIt std::find<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<_Ty>>>,Derived1>(_InIt,const _InIt,Derived1 *const &)' のリファレンスを確認してください
実現したいこと
thisはshared_ptrではないから比較できない、というのはなんとなくわかるのですが、thisとshared_ptrから出した何かを比較するのか(.get()をstd::find()のどこかに入れられる、等)、あるいはthis等のクラスインスタンス自身をshared_ptrと比較できる形にできるのか等、dynamic_castやstd::dynamic_pointer_castは適用できないようですが、わかりません。
他の部分や基底、派生クラスが包含するクラスにもshared_ptrは使用していますが、現在ではエラー箇所はこの箇所のみとなっています。エラー箇所ははっきりしないのですが、同様のstd::find()使用の2箇所なので、おそらくこのstd::find()がエラー箇所だと思うのですが、生ポインタではなくshared_ptrをvectorコンテナに格納して、プログラムが動作するようにしたいです。
よろしくお願いします。
![guest](/img/icon/icnUserSample.jpg)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。