質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Boost

Boost (ブースト)は、C++の先駆的な開発者のコミュニティ、 またそのコミュニティによって公開されているオープンソースライブラリのことを指します。

Q&A

解決済

2回答

4365閲覧

C++のmake_sharedでエラーが出ます...

penpen

総合スコア8

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Boost

Boost (ブースト)は、C++の先駆的な開発者のコミュニティ、 またそのコミュニティによって公開されているオープンソースライブラリのことを指します。

0グッド

0クリップ

投稿2015/04/26 13:31

最近,make_sharedを使ってリソース管理を行っているのですが,
いつものようにmake_sharedを使ったところエラーが出てしまいました...
エラーが出たコードは以下のようになっています(OpenCVを使っています)

main関数

lang

1cv::Mat img_src = imread("img.jpg"); 2boost::shared_ptr<MouseEvent> pPE = boost::make_shared<MELine>(img_src.clone()); // エラー 3cv::setMouseCallback("src", pPE->callback_event, 0);

MELineクラス

lang

1class MELine : public MouseEvent { 2 cv::Point start; 3 cv::Point end; 4 5public: 6 MELine(cv::Mat& edit_img) : 7 MouseEvent(edit_img), 8 start(-1), 9 end(-1) { 10}; 11 virtual ~MELine() {}; 12 void callback_event(int event, int x, int y, int flags, void* param) { 13 // 省略 14 }; 15};

MouseEventクラス

lang

1class MouseEvent { 2protected: 3 cv::Mat edit_img; 4 5public: 6 MouseEvent(cv::Mat& edit_img) : 7 edit_img(edit_img) { 8 } 9 virtual ~MouseEvent() {}; 10 virtual void callback_event(int event, int x, int y, int flags, void* param) = 0; 11};

エラー: required from here

main関数では画像内で生じたマウスイベントを受け取るコールバックを登録しています.
MELineクラスはMouseEventクラスを継承しており,線分を引くコールバック関数を定義しています.
MouseEventクラスはイベントの基底クラスです.

プログラミング初心者なので,言い回しや用語の使い方等色々と間違っている箇所はあると思いますが,
なぜmake_sharedでエラーが出てしまっているのか,教えていただけると助かります.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohhoy

2015/04/27 00:59

エラーメッセージを良く読んでください。質問本文に書かれているメッセージはごく一部に過ぎず、何も情報を読み取れません。
guest

回答2

0

MELineとMouseEventクラスのコンストラクタ引数型をconst cv::Mat&に変更するとどうでしょうかね。

投稿2015/04/27 08:26

yohhoy

総合スコア6189

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

OpenCVもboostライブラリも使わないのですが、回答が付かないようなので。

コードを見る限り怪しいのはMELineクラスのコンストラクタがcv::Matの参照を受け取るというところです。
ここからは私の手元に再現させる環境がないので推測なのですが、試しにmake_sharedを使わず

lang

1 MELine meline(image_src.clone());

がビルドを通るかやってみてください。これがダメだとmake_sharedもダメなはずです。
この場合エラーの理由は参照すべきオブジェクトの実体がないからだと思います。
なので、上記がエラーだとした場合の回避策は

lang

1 cv::Mat image_copy = image_src.clone(); 2 boost::shared_ptr<MouseEvent> pPE = boost::make_shared<MELine>(image_copy);

とすればうまくいくのではないかと思います。

投稿2015/04/27 06:54

KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

penpen

2015/04/27 13:35

返事が遅れてすみません 回答ありがとうございました! ただ,ご指摘くださった方法ではエラーは消えませんでした... そこで, cv::Mat image_copy = image_src.clone(); boost::shared_ptr<MouseEvent> pPE(new MELine(image_copy)); としたところ上手くいきました あまり納得はできていないので,もう少し粘って見ようかと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問