[解決済み】1つのクラスでメンバ関数を持つジェネリックstd::functionオブジェクトを使用する
2022-04-08 21:04:18
質問
あるクラスについて、同じクラスのメンバ関数への関数ポインタを1つの
map
格納
std::function
オブジェクトを作成します。しかし、このコードでは冒頭で失敗してしまいます。
#include <functional>
class Foo {
public:
void doSomething() {}
void bindFunction() {
// ERROR
std::function<void(void)> f = &Foo::doSomething;
}
};
受け取る
error C2064: term does not evaluate to a function taking 0 arguments
で
xxcallobj
というエラーと、奇妙なテンプレートのインスタンス化エラーとが混在しています。現在、私はWindows 8とVisual Studio 2010/2011で作業していますが、Win 7とVS10でも失敗しています。このエラーは、私が従っていないいくつかの奇妙なC++のルールに基づいている必要があります。
解決方法を教えてください。
非静的メンバ関数は、オブジェクトで呼び出す必要があります。つまり、常に暗黙のうちにこのポインタを引数として渡します。
なぜなら、あなたの
std::function
シグネチャでは、関数が引数を取らないことを指定しています (
<void(void)>
) の場合は、必ず
バインド
は、最初の(そして唯一の)引数です。
std::function<void(void)> f = std::bind(&Foo::doSomething, this);
関数をパラメータで束縛する場合は、プレースホルダを指定する必要があります。
using namespace std::placeholders;
std::function<void(int,int)> f = std::bind(&Foo::doSomethingArgs, this, std::placeholders::_1, std::placeholders::_2);
あるいは、あなたのコンパイラがC++11のラムダをサポートしている場合。
std::function<void(int,int)> f = [=](int a, int b) {
this->doSomethingArgs(a, b);
}
(手元にC++11が使えるコンパイラがないので 今すぐ ということで、こちらは確認できません)
関連
-
[解決済み】coutはstdのメンバではない
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み】メンバ関数でスレッドを開始する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】coutはstdのメンバではない
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件