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

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

新規登録して質問してみよう
ただいま回答率
85.36%
C++Builder

C++Builderは、C/C++を用いてアプリ開発できる統合開発環境 (IDE) 。DelphiのC++版です。コンポーネントによるビジュアル開発、高機能なコードエディターなどで生産性の高い開発ができます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

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

Q&A

解決済

1回答

4668閲覧

【c++】【thread】スレッド内で、引数にクラスインスタンスをもつメンバ関数を実行する。

chidori_nobu

総合スコア1

C++Builder

C++Builderは、C/C++を用いてアプリ開発できる統合開発環境 (IDE) 。DelphiのC++版です。コンポーネントによるビジュアル開発、高機能なコードエディターなどで生産性の高い開発ができます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

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

0グッド

0クリップ

投稿2020/07/24 05:59

編集2020/07/24 06:47

前提・実現したいこと

前提:
1.開発環境: visual studio
2.言語  : c++
3.その他 : threadを使用し、マルチスレッド化すること

実行手順:
1.メイン関数にて、まずクラスA,クラスBのインスタンスを生成。
2.スレッドを生成。
3.スレッド内でクラスBのメンバ関数(引数にクラスAのインスタンスを持つ)を実行。

発生している問題・エラーメッセージ

エラー 'std::invoke': 一致するオーバーロードされた関数が見つかりませんでした。 エラー 関数テンプレート 'unknown-type std::invoke(_Callable &&,_Types &&...) noexcept(<expr>)' の特定に失敗しました ```  ### 該当のソースコード ```c++ #include <iostream> #include <thread> using namespace std; class A{ public: void Hoge(){ //// } }; class B{ public: void HogeHoge(class A &a){ a.Hoge(); } }; int main(){ A *obja=new A; B *objb=new B; thread t1(&B::HogeHoge,objb,ref(obja)); t1.join(); return 0; }

試したこと

各サイトで調査をしたが、改善法を探しきれなかった。

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

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

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

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

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

guest

回答1

0

ベストアンサー

thread t1(&A::HogeHoge,objb,ref(obja));

thread t1(&B::HogeHoge,objb,ref(obja)); のマチガイ?

投稿2020/07/24 06:10

episteme

総合スコア16612

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

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

chidori_nobu

2020/07/24 06:12 編集

そうです。間違えました。 ご指摘ありがとうございます。 正しくは thread t1(&B::HogeHoge,objb,ref(obja)); と実行しました。
episteme

2020/07/24 06:13

僕とこでは B にとっかえてコンパイル/実行できたけど、これで解決?
chidori_nobu

2020/07/24 06:14

すいません。言葉足らずでした。 thread t1(&B::HogeHoge,objb,ref(obja)); と実行すると、 上記したエラーメッセージが表示されてしまいます。
episteme

2020/07/24 06:17

僕とこと現象違うね、なんでやろ...
chidori_nobu

2020/07/24 06:24

実行環境の問題でしょうか? 参照渡しがうまくできていないような気がするのですが、 原因がわかりません....
chidori_nobu

2020/07/24 06:50

実際のコードでは、インスタンスを動的に確保していました。 度重なる間違いがあり、申し訳ありません。 現在修正を加えております。 メモリの確保・解放をコントロールしたいため、インスタンスを動的に確保したいと考えています。 その場合の解決法がありましたら、教えていただけませんか。
episteme

2020/07/24 07:58 編集

A *obja=new A; B *objb=new B; thread t1(&B::HogeHoge,*objb,ref(*obja)); // thread t1(&B::HogeHoge, objb,ref(*obja)); これでもよさげ これじゃダメ?
chidori_nobu

2020/07/28 12:40

うまくコンパイルされました! ありがとうございます。
episteme

2020/07/28 16:22

てか thread t1([=]() { objb->HogeHoge(*obja); }); でよくね?
chidori_nobu

2020/07/30 14:14

同様にコンパイルできました! ただコード文の意味が理解できておりません... [=]() は一体何をしているのでしょうか....
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問