我有一些继承的代码,像这样。 (请笑声。我什至知道我将其伪编后还是很难看的。这就是为什么我要改进它,而我要做的第一件事就是骨头(通过我的思维方式)从纪元起将时间存储为毫秒数的两倍,并使用该时间作为多 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 mapusing 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
通过显式设置比较,您可以确保不会发生冲突。

10-08 08:43