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

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

ただいまの
回答率

90.35%

  • C++

    4781questions

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

  • OpenCV

    1659questions

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

  • Boost

    33questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,105

penpen

score 10

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

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

MELineクラス
class MELine : public MouseEvent {
    cv::Point start;
    cv::Point end;

public:
    MELine(cv::Mat& edit_img) :
        MouseEvent(edit_img),
        start(-1),
        end(-1) {
};
    virtual ~MELine() {};
    void callback_event(int event, int x, int y, int flags, void* param) {
        // 省略
    };
};

MouseEventクラス
class MouseEvent {
protected:
    cv::Mat edit_img;

public:
    MouseEvent(cv::Mat& edit_img) :
        edit_img(edit_img) {
    }
    virtual ~MouseEvent() {};
    virtual void callback_event(int event, int x, int y, int flags, void* param) = 0;
};

エラー:  required from here

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yohhoy

    2015/04/27 09:59

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

    キャンセル

回答 2

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

-1

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

コードを見る限り怪しいのはMELineクラスのコンストラクタがcv::Matの参照を受け取るというところです。
ここからは私の手元に再現させる環境がないので推測なのですが、試しにmake_sharedを使わず
    MELine meline(image_src.clone());
がビルドを通るかやってみてください。これがダメだとmake_sharedもダメなはずです。
この場合エラーの理由は参照すべきオブジェクトの実体がないからだと思います。
なので、上記がエラーだとした場合の回避策は
    cv::Mat image_copy = image_src.clone();
    boost::shared_ptr<MouseEvent> pPE = boost::make_shared<MELine>(image_copy);
とすればうまくいくのではないかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/27 22:35

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

    あまり納得はできていないので,もう少し粘って見ようかと思います

    キャンセル

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

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C++

    4781questions

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

  • OpenCV

    1659questions

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

  • Boost

    33questions

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