0

トピックとして定義された構造の作成に問題があるようです。

私の目的は、一種のイベント ハンドラーを作成することです (プログラミングが良いか悪いか、またはマルチスレッドでないかどうかは問題ではありません。今のところは練習用です)。

私の考えは、関数へのポインターのベクトルを作成し、このベクトルをキーが文字列であるマップに配置することです。

奇妙なエラーが発生するため、概念的に間違ったことをしているに違いありません:私のコードは次のとおりです(エラーは最後にあります):

.h file
//ptr to function
typedef int (*pt2Function)(void*);
typedef std::vector<pt2Function> fPtrVector;

class eventDispatcher
{

public:
    //stuff 
    void addListener(std::string,pt2Function);

protected:
    //stuff
     std::map<std::string,fPtrVector> _listeners;
};

そしてここにcppがあります:

.cpp file

void eventDispatcher::addListener(std::string eventName ,pt2Function function)
{
  std::map<std::string,fPtrVector>::iterator it;

  it=this->_listeners.find(eventName);
  if(it != this->_listeners.end())
  {
//do something
  }
  else 
  {
    std::vector<pt2Function> tmp;
    tmp.insert(function);  // here occurs error 1

    this->_listeners.insert(eventName,tmp);  // here occurs error 2
    std::cout<<"cnt: "<< this->_listeners.count(); 
  } 

}

私が得るエラーは次のとおりです。

1)  no matching function for call to 'std::vector <int (*)(void*), std::allocator<int (*)(void*)> >::insert(int (*&)(void*))'

2)  no matching function for call to 'std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<int (*)(void*), std::allocator<int (*)(void*)> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<int (*)(void*), std::allocator<int (*)(void*)> > > > >::insert(std::string&, std::vector<int (*)(void*), std::allocator<int (*)(void*)> >&)'
4

4 に答える 4

2

のバリエーションはなくstd::vector::insert()、単一の引数を取ります。すべて、新しい要素を挿入する必要がある位置を示すイテレータを取ります。代わりstd::vector::push_back()に追加するために使用します。function

std::map::insert()いくつかのバリエーションがありますが、使用しようとしているものは、次のように定義されているvalue_typeの を取ります。map

value_type  std::pair<const Key, T>

あなたの場合、value_typeaは次のstd::pair<std::string, fPtrVector>とおりです。

this->_listeners.insert(std::pair(eventName,tmp));
于 2012-08-07T08:55:53.740 に答える
2

への参照を確認するinsertと、イテレータと値の 2 つの引数を取ることがわかります。値を追加するには、push_back代わりに eg を使用します。

マップの場合は、_listeners[eventName] = tmp;代わりに使用できます。

于 2012-08-07T09:04:57.357 に答える
1

1)イテレータで位置を指定して動作さinsert()せる方法。std::vectorあなたの場合、使用できますpush_back()

2) insert(std::make_pair(eventName, tmp))and を使用すると、マップによって必要な値の型が作成されます。

于 2012-08-07T08:55:39.253 に答える
0
  1. あなたが探しているものですstd::vector::push_backここのドキュメントを参照してstd::vectorください)。

  2. あなたが探しているものですstd::map::operator []ここのドキュメントを参照してstd::mapください)。

于 2012-08-07T08:56:03.507 に答える