我有一些继承的代码就是这样的。 (请抱着笑声......我知道这是丑陋的,即使我伪编了它。这就是为什么我要改进它,我的第一件事就是骨头(按我的思维方式)将时间存储为自纪元以来的两倍毫秒,并将该时间用作多图中的关键字。无论如何这是“之前”代码,称之为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 map和using 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;)”的多重定义。“
其中一个更接近正确的轨道,还是完全不同的东西?
答案 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 ++库发生冲突。他们可能没有定义相同的顺序,然后事情变得复杂。
通过明确设置比较,您保证不会发生冲突。