在multimap中使用timespec结构,在何处和/或如何定义operator<

时间:2012-03-20 01:39:22

标签: c++ struct multimap

我有一些继承的代码就是这样的。 (请抱着笑声......我知道这是丑陋的,即使我伪编了它。这就是为什么我要改进它,我的第一件事就是骨头(按我的思维方式)将时间存储为自纪元以来的两倍毫秒,并将该时间用作多图中的关键字。无论如何这是“之前”代码,称之为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;

我也知道我的平台不能在接近纳秒的时间内提供时间精度,但它比秒或毫秒好一点。此外,我尝试了解并实施来自谷歌搜索结果和此网站(C++ Using .find() with struct as key in mapusing struct as key in map)的几个类似问题的建议。然而,这些略有不同,因为它们是用于他们自己的新结构,我正在尝试使用现有的标准库结构。

所以我的主要目标是将最后一行改为:

typedef multimap<timespec, fooPtr> fooTimeMap;

当我只做出改变时,我得到了

在成员函数'bool std :: less&lt; _Ty&gt; :: operator()(const _Ty&amp;,const _Ty&amp;)const [with _Ty = timespec]'中: /.../include/cpp/xtree:895:从'std :: _ Tree&lt; _Traits&gt; :: iterator std :: _ Tree&lt; _Traits&gt; :: find(const typename _Traits :: key_type&amp;)[with _Traits = std]实例化:: _ Tmap_traits,std :: less,std :: allocator&gt; &gt;,true&gt;]' /home/.../foo.cpp:109:从这里实例化 /.../include/cpp/functional:136:错误:'运营商&lt;'不匹配在'_Left&lt; _right'

基于这些和其他引用的帖子,我试图为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,...>编译(并运行: - )。另外一些帖子谈论定义运算符&lt;(...)和其他人谈论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,感谢您的回复......是的,其他帖子也提到了这些,虽然我说的略有不同的情况,比如他们自己的新结构,我试图适用于我的情况。

e.g。 1)当我在foo的{braces}内bool operator() (const timespec& lhs, const timespec& rhs)时,我仍然得到“错误:不匹配'运算符&lt;'在'_Left&lt; _Right'“

e.g。 2)当我在大括号之外,在typedef multimap之前,我得到“bool operator()(const timespec&amp;,const timespec&amp;)'必须是非静态成员函数”。

e.g。 3)当我在大括号内bool operator< (const timespec& lhs, const timespec& rhs)时,我得到''bool foo :: operator&lt;(const timespec&amp;,const timespec&amp;)'必须只接受一个参数“并且即使我将其改为一个参数,我不认为这就是我想要的,因为我不想告诉它如何比较foo和时间规格。

e.g。 4)当我在大括号之外,在typedef multimap之前,我得到“运算符&lt;(timespec const&amp;,timespec const&amp;)”的多重定义。“

其中一个更接近正确的轨道,还是完全不同的东西?

2 个答案:

答案 0 :(得分:1)

为什么不将less-than运算符定义为

bool operator< (const timespec& lhs, const timespec& rhs) { ... }

与你写的有什么不同?函数调用运算符()()确实可以用来代替运算符&lt;(),但不一样。无论如何,运算符&lt;()可能更容易。

祝你好运。

答案 1 :(得分:0)

我会稍微改变一下:

struct TimeTest
{
    bool operator()(timespec const& lhs, timespec const& rhs) const
    {
         return <TEST>
    }
};
typedef multimap<timespec, fooPtr, TimeTest> fooTimeMap;

我采取额外步骤的原因是,如果你定义运算符&lt;对于timespec来说,它很可能与任何使用时间信息的C ++库发生冲突。他们可能没有定义相同的顺序,然后事情变得复杂。

通过明确设置比较,您保证不会发生冲突。