2012-08-07 103 views
0

我似乎在创建定义为主题的结构时遇到了一些问题。C++,stl函数向量指针映射

我的目标是创建一种事件处理程序(不管它是好的还是坏的程序设计,或者它不是多线程:目前只是为了实践)。

然后我的想法是创建一个指向函数的指针矢量,并将该矢量放置在一个映射中,其中的键是一个字符串。

我必须做一些概念性错误的,因为我得到一些奇怪的错误: 我的代码如下(误差在后):

.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*)> >&)' 
+0

我觉得很蠢......谢谢大家的回答 – Stormsson 2012-08-07 09:23:33

回答

2

如果检查insert参考你看到它有两个参数,一个迭代和值。只需添加一个值,例如push_back

对于地图,您可以改为使用_listeners[eventName] = tmp;

1

1)std::vectorinsert()方法通过使用迭代器指定位置来工作。对于你的情况,你可以使用push_back()

2)使用insert(std::make_pair(eventName, tmp))并且将根据地图创建所需的值类型。

2

没有变化的std::vector::insert()需要一个参数:全部采用一个迭代器来指示新元素必须先插入的位置。改为使用std::vector::push_back()添加function

std::map::insert()有一些变化,但您正在尝试使用一个取map,它被定义为的value_type

value_type std::pair<const Key, T> 
你的情况

value_typestd::pair<std::string, fPtrVector>

this->_listeners.insert(std::pair(eventName,tmp));