Я ошибся в определении своего класса, из-за чего реализация 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 также не решило проблему. Должно быть что-то, что я не сделал в другом месте программы, чтобы вызвать такую ошибку.