У меня есть какой-то унаследованный код, который выглядит примерно так. (Пожалуйста, держите смех ... Я ЗНАЮ, что это уродливо, даже после того, как я его псевдокодифицировал. Вот почему я пытаюсь улучшить его, и мое первое, над чем нужно работать - это голова с костью (по моему мнению) сохранение времени как двойной миллисекунды с начала эпохи и использование этого времени в качестве ключа в мультикарте). В любом случае, это код "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;
Я также знаю, что моя платформа не обеспечивает точности по времени где-то около наносекунд, но она немного лучше, чем секунды или миллисекунды. Также я попытался понять и реализовать предложения из нескольких похожих вопросов, как из результатов Google, так и с этого сайта ( C ++. Использование .find () с ключом struct в карте и с использованием struct key на карте ). Однако они немного отличаются, потому что они для своей новой структуры, и я пытаюсь сделать это с помощью существующей стандартной структуры библиотеки.
Поэтому моя главная цель - изменить эту последнюю строку на:
typedef multimap<timespec, fooPtr> fooTimeMap;
Когда я делаю только это изменение, я получаю
В функции-члене 'bool std :: less <_Ty> :: operator () (const _Ty &, const _Ty &) const [with _Ty = timespec]':
/.../include/cpp/xtree:895: создается из 'std :: _ Tree <_Traits> :: iterator std :: _ Tree <_Traits> :: find (постоянное имя типа _Traits :: key_type &) [with _Traits = std: : _Tmap_traits, std :: less, std :: allocator>>, true>] '
/home/.../foo.cpp:109: создается здесь
/.../include/cpp/functional:136: ошибка: нет совпадения с оператором в поле _Left <_Right '</p>
Основываясь на этих и других ссылках, я попытался определить оператор меньше чем для timepec ... например, перед закрытием} класса 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,...>
(и выполнить: -). Также в некоторых публикациях говорится об определении оператора <(...), а в других - об операторе () (...). </p>
Я бы предпочел не определять целый новый класс-обертку, такой как timespec_compare_class, вокруг timespec (я видел синтаксис multimap<timespec, fooPtr, timespec_compare_class>
в других публикациях), поэтому я бы предпочел этого избегать, если есть способ сделать это в классе сам foo или даже после} foo, но все еще внутри foo.h.
(обратите внимание, я не думаю, что «оператор bool () (const ptr poFoo1, const ptr poFoo2)», ни fooQueue, fooList или fooListPtr имеют отношение к вопросу, но я оставил их в псевдо -код на всякий случай.)
Итак, кроме "чтения учебника по С ++", который, как я знаю, мне нужно сделать, кто-нибудь может подсказать мне более быстрое решение?
@ thb и @MarkRansom, спасибо, что ответили ... да, они были упомянуты и в других постах, хотя, как я сказал, немного другие случаи, например, с их собственными новыми структурами, которые я пытался применить к своему делу.
например. 1) Когда я делаю bool operator() (const timespec& lhs, const timespec& rhs)
внутри {фигурных скобок} foo, я все равно получаю "ошибку: нет совпадения с оператором <в" _Left <_Right "" </p>
например. 2) когда я делаю это вне фигурных скобок, непосредственно перед multimap typedef, я получаю «bool operator () (const timespec &, const timespec &) 'должен быть нестатической функцией-членом».
например. 3) Когда я делаю bool operator< (const timespec& lhs, const timespec& rhs)
внутри фигурных скобок, я получаю "bool foo :: operator <(const timespec &, const timespec &) 'должен принимать ровно один аргумент" И даже если я изменил это на один аргумент, я не думаю, это то, что я хочу, потому что я не пытаюсь объяснить, как сравнить foo с timepec. </p>
например. 4) Когда я делаю это вне фигурных скобок, непосредственно перед multimap typedef, я получаю «множественное определение оператора <(timespec const &, timespec const &) '". </p>
Так один из них ближе к правильному пути или что-то совершенно другое?