Поиск неисправностей при поиске по hash_multimap - PullRequest
1 голос
/ 23 декабря 2009

Я ошибся в определении своего класса, из-за чего реализация hash_multimap в Microsoft "пропустила". Вот мой класс:

class TimeParameter {
public:

TimeParameter(int _year, int _julianDay, int _hour) : m_Year(_year),
                                                      m_JulianDay(_julianDay),
                                                      m_Hour(_hour){}

int     GetHour() const {return m_Hour;}
int     GetJulianDay() const {return m_JulianDay;}
int     GetYear() const {return m_Year;}


bool operator==(const TimeParameter &_rhs);
bool operator < (const TimeParameter &_rhs);
operator size_t() const;
friend bool operator<(const TimeParameter &_lhs, const TimeParameter &_rhs);

private:

int m_Hour,
    m_JulianDay,
    m_Year;
};

с файлом cpp как

TimeParameter::operator size_t() const
{
    return (size_t)(8765u * (m_Year % 6)) + (size_t)(m_JulianDay*24u) + (size_t)m_Hour;
}

bool operator<(const TimeParameter &_lhs, const TimeParameter &_rhs)
{
    if( _lhs.GetYear() > _rhs.GetYear() )
    {
        return false;
    }
    else if( _lhs.GetYear() == _rhs.GetYear()
        && _lhs.GetJulianDay() > _rhs.GetJulianDay() )
    {
        return false;
    }
    else if( _lhs.GetYear() == _rhs.GetYear() 
        && _lhs.GetJulianDay() == _rhs.GetJulianDay()
        && _lhs.GetHour() > _rhs.GetHour() )
    {
        return false;
    }

    return true;
}

bool TimeParameter::operator==(const TimeParameter &_rhs)
{
    return m_Hour == _rhs.GetHour()
        && m_JulianDay == _rhs.GetJulianDay()
        && m_Year == _rhs.GetYear();
}

bool TimeParameter::operator <(const TimeParameter &_rhs)
{
    if( m_Year > _rhs.GetYear() )
    {
        return false;
    }
    else if( m_Year == _rhs.GetYear()
        && m_JulianDay > _rhs.GetJulianDay() )
    {
        return false;
    }
    else if( m_Year == _rhs.GetYear() 
        && m_JulianDay == _rhs.GetJulianDay()
        && m_Hour > _rhs.GetHour() )
    {
        return false;
    }

    return true;
}

Если я затем использую этот класс в качестве ключа в hash_multimap <'TimeParameter, Foo'>, я не смогу тогда использовать hash_multimap :: find (), чтобы найти что-либо. Что я сделал не так?

Примечание. Да, я понимаю, что это еще один класс стиля даты-времени (у меня колесо квадратное!). Мы должны создать класс для каждой строки каждой таблицы БД в соответствии с требованиями проекта. И да, они действительно создали таблицу только для года, дня, часа вместо использования хорошо установленных столбцов типа DateTime. Поскольку они нам платят, мы не спорим.

Кроме того, не стесняйтесь обвинять меня в нарушении СУХОГО.

Обновление:

Изменение оператора size_t () на return 0; не решило проблему. Он до сих пор ничего не может найти. Изменение операторов для получения всегда true также не решило проблему. Должно быть что-то, что я не сделал в другом месте программы, чтобы вызвать такую ​​ошибку.

Ответы [ 2 ]

2 голосов
/ 23 декабря 2009

Почему у вас есть две реализации operator<? Держи любого.

Кроме того, вам, вероятно, потребуется определить правильную хеш-функцию (и дополнительно указать, какой op< будет использоваться).

0 голосов
/ 24 декабря 2009

Это проблема с прокруткой вашей собственной функции DateTime. Это не только сделано до тошноты, но и является постоянным источником ошибок. Я хотел бы обвинить требования проекта, но кого я действительно шучу? Я не сделал проверку равных в менее чем операторов. Такой маленький, такой глупый, а теперь такой публичный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...