私はまだ新しいstlメンバーの初心者ですが、このコードがセグメンテーション違反を引き起こしている理由を誰かが指摘できますか?
#include<memory>
#include<stdio.h>
#include<map>
#include<set>
#include<string>
using namespace std;
struct StubClass
{
weak_ptr<string> b;
int c;
friend bool operator==(StubClass x,StubClass y);
friend bool operator<(StubClass x,StubClass y);
StubClass(weak_ptr<string> x):b(x){c=5;}
};
bool operator==(StubClass d,StubClass c) { return d.b==c.b;}
bool operator<(StubClass d,StubClass c) { return d.b<c.b; }
int main()
{
shared_ptr<string> spPtr(new string("Hello"));
weak_ptr<string> wpPtr(spPtr);
StubClass hello(wpPtr);
set<StubClass> helloSet;
helloSet.insert(hello);
if(helloSet.find(StubClass(wpPtr))!=helloSet.end()) printf("YAYA");
else puts("Bye");
}
エラーは一列に並んでいます
if(helloSet.find(StubClass(wpPtr))!= helloSet.end())printf( "YAYA");
さらなる調査により、StubClassのコンパレータ関数が呼び出されたときに問題があることが明らかになりました。ここでプログラムをコンパイルしています
編集:
bool operator==(StubClass d,StubClass c) { return d.b.lock()==c.b.lock();}
bool operator<(StubClass d,StubClass c) { return d.b.lock()<c.b.lock(); }
これで問題は解決しました。もっと読む必要があります。:(とにかく、コミュニティの誰もが最初のコードがSIGSEGVを与える理由を説明できます。私は最終的にそれを理解しましたが、それでも良い説明は害にはなりません。:)