4

を作成する方法はありますvector< mem_fun_t< ReturnType, MyClass > >か?

私が見ているエラーは次のとおりです。

error C2512: 'std::mem_fun1_t<_Result,_Ty,_Arg>' : no appropriate default constructor available
4

3 に答える 3

4

なぜそれが機能しないのか本当にわかりませんが、実際にはかなり醜い解決策です。vector<function<ReturnType(MyClass*)>>C++03バインダーに存在するこれらの問題を回避してください。

于 2010-09-03T17:21:12.413 に答える
3

あなたは確かにそのようなベクトルを作成することができます。

#include <vector>
#include <functional>
#include <iostream>

struct MyClass
{
    int a()  { return 1; }
    int b()  { return 2; }
};

int main()
{
    std::vector<std::mem_fun_t<int, MyClass> > vec;
    vec.push_back(std::mem_fun(&MyClass::a));
    vec.push_back(std::mem_fun(&MyClass::b));
    MyClass x;
    for (size_t i = 0; i != vec.size(); ++i) {
        std::cout << vec[i](&x) << '\n';
    }
}

問題が発生した場合は、エラーメッセージを注意深くお読みください。たとえば、std::mem_fun渡すものに応じて、あらゆる種類のラッパーを返すことができます。

または、実際、ブーストまたはC++0xに切り替えfunctionます。


編集:この特定のエラーメッセージで、含まれている型のデフォルトコンストラクターを呼び出す何かをしていると思います(たとえばresize、ベクトルのコンストラクターでサイズを指定します)。これらの機能は使用できません。

于 2010-09-03T17:33:57.260 に答える
2

mem_fun_tコンテナに格納するための要件を満たしているため(コピー構築可能で割り当て可能)、答えは「はい」です。

ただし、デフォルトでは構築可能または比較可能ではないため、それらのコンテナでは実行できないことがいくつかあります。

  • 埋める値を提供しない限り、サイズ変更
  • 埋める値を指定しない限り、ゼロ以外のサイズで構築する
  • コンテナの比較

表示されているエラーは、サイズを変更するか、サイズを使用して作成しようとしたことが原因です。

于 2010-09-03T17:50:07.037 に答える