我有一些继承的代码,像这样。 (请笑声。我什至知道我将其伪编后还是很难看的。这就是为什么我要改进它,而我要做的第一件事就是骨头(通过我的思维方式)从纪元起将时间存储为毫秒数的两倍,并使用该时间作为多 map 中的键)。无论如何,这是“之前”代码,将其称为foo.h:
#include <vector>
#include <map>
#include <list>
#include <queue>
#include <string>
#include <time.h>
using namespace std;
#include "yasper.h"
using yasper::ptr;
class foo
{
private:
...
public:
foo(...);
virtual ~foo();
...
bool operator() (const ptr<foo> poFoo1, const ptr<foo> poFoo2)
{
...
}
}
...
typedef ptr<foo> fooPtr;
typedef queue<fooPtr> fooQueue;
typedef list<fooPtr> fooList;
typedef fooList *fooListPtr;
typedef multimap<double, fooPtr> fooTimeMap;
我还知道,我的平台无法提供近十亿分之一秒的时间精度,但比秒或毫秒要好一点。我也试图理解和实施来自Google搜索结果和本网站(C++ Using .find() with struct as key in map和using struct as key in map)的几个类似问题的建议。但是,这些稍有不同,因为它们是针对自己的新结构的,我正在尝试使用现有的标准库结构来实现。
所以我的主要目标是将最后一行更改为:
typedef multimap<timespec, fooPtr> fooTimeMap;
当我仅进行更改时,我得到
在成员函数'bool std::less ::operator()(const _Ty&,const _Ty&)const [with _Ty = timespec]'中:
/.../include/cpp/xtree:895:从'std::_ Tree ::iterator std::_ Tree ::find(const类型名_Traits::key_type&)实例化[带有_Traits = std: :_Tmap_traits,std::less,std::allocator>>,true>]'
/home/.../foo.cpp:109:从此处实例化
/.../include/cpp/functional:136:错误:“_ Left
根据这些以及其他引用的帖子,我尝试为timespec定义小于操作符...例如在foo类的}结束之前,我把
bool operator() (const timespec& lhs, const timespec& rhs)
{
return ( lhs.tv_nsec < rhs.tv_nsec && lhs.tv_sec == rhs.tv_sec ) ||
lhs.tv_sec < rhs.tv_sec;
}
但是我想我不知道在哪里做这件事以及为什么。或者,即使它不是“正确的地方”,而是足以使
multimap<timespec,...>
编译的有效位置(并运行:-)。也有一些帖子谈论定义operator 我宁愿不在timespec周围定义像timespec_compare_class这样的全新包装器类(我已经在其他文章中看到了
multimap<timespec, fooPtr, timespec_compare_class>
的语法),所以我宁愿避免在类foo本身中甚至有办法做到这一点在foo的}之后,但仍在foo.h中。(请注意,我不认为“bool operator()(const ptr poFoo1,const ptr poFoo2)”,也不是fooQueue,fooList或fooListPtr与问题相关,但我只是将它们留在了伪代码中如果。)
因此,除了我知道我需要做的“阅读C++入门”之外,还有谁能为我提供一个更快的解决方案?
@thb和@MarkRansom,感谢您的回复...是的,虽然我说的情况与他们自己的新结构(例如,我尝试将其应用于我的结构)略有不同,但其他帖子中也提到了这些。
例如1)当我在foo的{大括号}中执行
bool operator() (const timespec& lhs, const timespec& rhs)
时,仍然出现“错误:'_ Left 例如2)当我在括号之外,在typedef multimap之前执行此操作时,我得到“bool operator()(const timespec&,const timespec&)'必须是非静态成员函数”。
例如3)当我在括号内执行
bool operator< (const timespec& lhs, const timespec& rhs)
时,我得到“'bool foo::operator 例如4)当我在括号之外,在typedef multimap之前,得到“operator
那么其中之一更接近正确轨道,还是完全不同?
最佳答案
我会稍作更改:
struct TimeTest
{
bool operator()(timespec const& lhs, timespec const& rhs) const
{
return <TEST>
}
};
typedef multimap<timespec, fooPtr, TimeTest> fooTimeMap;
我要采取额外步骤的原因是,如果为timespec定义operator
通过显式设置比较,您可以确保不会发生冲突。