Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在multimap中使用timespec结构,在何处和/或如何定义运算符<;_C++_Struct_Multimap - Fatal编程技术网

C++ 在multimap中使用timespec结构,在何处和/或如何定义运算符<;

C++ 在multimap中使用timespec结构,在何处和/或如何定义运算符<;,c++,struct,multimap,C++,Struct,Multimap,我继承了一些类似这样的代码。(请不要笑……我知道这很难看,即使我已经伪编码了它。这就是为什么我要尝试改进它,我的第一件工作是(按照我的想法)将时间存储为从纪元开始的两倍毫秒,并将该时间用作多重映射中的键)。无论如何,这是“before”代码,称之为foo.h: #include <vector> #include <map> #include <list> #include <queue> #include <string> #incl

我继承了一些类似这样的代码。(请不要笑……我知道这很难看,即使我已经伪编码了它。这就是为什么我要尝试改进它,我的第一件工作是(按照我的想法)将时间存储为从纪元开始的两倍毫秒,并将该时间用作多重映射中的键)。无论如何,这是“before”代码,称之为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;
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
#包括“yasper.h”
使用yasper::ptr;
福班
{
私人:
...
公众:
foo(…);
虚拟~foo();
...
布尔运算符()(常数ptr poFoo1,常数ptr poFoo2)
{
...
}
}
...
typedef ptr fooPtr;
typedef队列;
类型定义列表傻瓜;
typedef-dublist*dublistptr;
typedef多地图fooTimeMap;
我也知道我的平台不能提供接近纳秒的时间精度,但它比秒或毫秒要好一点。此外,我还试图理解和实施来自谷歌搜索结果和本网站(和)的几个类似问题的建议。然而,它们略有不同,因为它们是为自己的新结构而设计的,我正试图用现有的标准库结构来实现这一点

因此,我的主要目标是将最后一行更改为:

typedef multimap<timespec, fooPtr> fooTimeMap;
typedef多重映射fooTimeMap;
当我只做那个改变时,我得到了

在成员函数“bool std::less::operator()(const _Ty&,const _Ty&)const[with _Ty=timespec]”中: /…/include/cpp/xtree:895:从“std::_-Tree::iterator std::_-Tree::find(const-typename _-Traits::key)&[with _-Traits=std:_-Tmap\u-Traits,std::less,std::allocator>,true>]实例化 /home/../foo.cpp:109:从此处实例化
/…/include/cpp/functional:136:error:no match for'operator为什么不将小于运算符定义为

bool operator< (const timespec& lhs, const timespec& rhs) { ... }
bool运算符<(常数时间域和lhs,常数时间域和rhs){…}

和你写的有点不同?确实可以使用函数call operator()()代替运算符为什么不将小于运算符定义为

bool operator< (const timespec& lhs, const timespec& rhs) { ... }
bool运算符<(常数时间域和lhs,常数时间域和rhs){…}

和你写的有点不同?确实可以使用函数call operator()()来代替运算符我会稍微修改一下:

struct TimeTest
{
    bool operator()(timespec const& lhs, timespec const& rhs) const
    {
         return <TEST>
    }
};
typedef multimap<timespec, fooPtr, TimeTest> fooTimeMap;
struct-TimeTest
{
布尔运算符()(timespec常量和lhs、timespec常量和rhs)常量
{
返回
}
};
typedef多地图fooTimeMap;

我之所以采取额外的步骤是,如果你定义了操作符< TimeSimi,它与使用时间信息的C++库有很大的冲突。它们可能不定义相同的顺序,然后事情就变得复杂了


通过显式设置比较,可以保证不会发生冲突

我会稍微修改一下:

struct TimeTest
{
    bool operator()(timespec const& lhs, timespec const& rhs) const
    {
         return <TEST>
    }
};
typedef multimap<timespec, fooPtr, TimeTest> fooTimeMap;
struct-TimeTest
{
布尔运算符()(timespec常量和lhs、timespec常量和rhs)常量
{
返回
}
};
typedef多地图fooTimeMap;

我之所以采取额外的步骤是,如果你定义了操作符< TimeSimi,它与使用时间信息的C++库有很大的冲突。它们可能不定义相同的顺序,然后事情就变得复杂了


通过显式设置比较,可以保证不会发生冲突

是否有理由不将运算符()重命名为运算符?是否有理由不将运算符()重命名为运算符右侧
operator()
只有当它是一个类的成员时才有意义,在这种情况下,该类将被称为functor。是的,我也尝试过,但似乎仍然无法正确理解语法,因此我一定没有正确理解某些内容。这里的问题是,您可能会与另一个包定义的小于运算符发生冲突。我认为提供了容器的比较函子,而不是依赖默认模板参数将其映射到运算符右侧
operator()
只有当它是一个类的成员时才有意义,在这种情况下,该类将被称为functor。是的,我也尝试过,但似乎仍然无法正确理解语法,因此我一定没有正确理解某些内容。这里的问题是,您可能会与另一个包定义的小于运算符发生冲突。我认为它为容器提供了比较函子,而不是依赖默认模板参数将其映射到操作符。为陌生人的善意干杯!!这将编译(在“类foo{…}”之外)。非常感谢你!struct TimeTest{bool operator()(const timespec&lhs,const timespec&rhs)const{return(lhs.tv_nsec