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_typemap,其定义为:

value_type  std::pair<const Key, T>

在你的情况下value_typestd::pair<std::string, fPtrVector>

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

如果你检查一个对你的引用,insert你会发现它有两个参数,一个迭代器和值。要添加一个值,请使用 egpush_back代替。

对于地图,您可以_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 回答