Проблема в том, что функция сравнения является частью типа экземпляра шаблона std::map
.Значение по умолчанию для функции сравнения, используемой std::map<K, T>
, равно std::less<T>
.Так что
std::map<uint64_t, std::shared_ptr<MyObj>, std::less<uint64_t>>
и
std::map<uint64_t, std::shared_ptr<MyObj>>
оказываются одного типа (вторая версия будет использовать аргумент по умолчанию для функции сравнения, который будет std::less<uint64_t>
).Однако если вы используете std::less<>
(что эквивалентно std::less<void>
) в качестве функции сравнения для _reverse
, то типы _normal
и _reverse
больше не будут одинаковыми.Только _normal
по-прежнему будет иметь тип tMyMap
, который использует функцию сравнения по умолчанию, в то время как _reverse
будет другим, не связанным типом.
Если цель MyData
состоит в том, чтобы просто удерживать этидве карты, вы можете рассмотреть возможность просто превратить его в структуру:
struct MyData {
std::map<uint64_t, std::shared_ptr<MyObj>> normal;
std::map<uint64_t, std::shared_ptr<MyObj>, std::less<>> reverse;
};
или просто использовать auto
, чтобы избежать необходимости повторять тип каждой карты
class MyData {
public:
const auto& get_normal() const { return _normal; }
const auto& get_reverse() const { return _reverse; }
private:
std::map<uint64_t, std::shared_ptr<MyObj>> _normal;
std::map<uint64_t, std::shared_ptr<MyObj>, std::less<>> _reverse;
};