【发布时间】:2013-03-24 06:11:29
【问题描述】:
很简单,这段代码有什么问题?
typedef std::function<double()> Event;
typedef std::tuple <double, std::function<double()>> Event_handle;
std::multiset < Event_handle > event_multiset;
std::vector < Event_handle > event_vector;
void add_event_handler(double time, Event func_object)
{
// multiset version gives an error
// event_multiset.insert (std::make_tuple(time, func_object));
// vector is ok
event_vector.push_back(std::make_tuple(time, func_object));
}
使用 g++ 4.7.2 编译 - 只需使用命令 g++ -std=c++11 main.cpp
我为什么要这样做?
程序实时运行,add_even_handler函数包含一个double类型的值,称为time(注意这里的time变量与时钟或实际时间无关,它只是一个增加 double 类型的对象)。因此,当用户添加一些事件时,它会在某个时间被调用。
标准下的多集容器会按某种顺序整理对象(通常,如果不总是,std::less<T>)。然后循环容器,我可以在变量double time的变化增加时调用Event。
有什么问题?
正如 KyleC 所指出的(见他的回答),std::function<> 编译器不理解在什么过程中订购
我是如何克服这个问题的
你每天都能学到新东西。上面的代码是最初混合std::multiset 和std::tuple 过度思考问题的结果。 std::map<T,S> 或 std::multimap<T,S> 也按关联的 key 排序,在本例中为 double 类型,默认情况下又是 std::less<T>。所以代替上面的,我做了类似下面的事情
std::multimap <double, event> event_map;
void add_event_handler(double time, Event func_object)
{
// multimap is ok
event_map.insert(std::make_pair(time,func_object));
}
这只是写在这里,以防它可能对人们有所帮助,尽管很明显但仍然如此。
【问题讨论】:
-
你能发布错误的相关部分吗?
-
@KyleC 快速问题,如何在 g++ 中将编译器错误输出到文本文件?
标签: c++ vector insert std-function multiset