c ++ неоднозначность перегрузки между int64 и time_t - PullRequest
0 голосов
/ 27 июня 2018

У меня есть класс Format, который необходимо скомпилировать для 32- и 64-разрядных платформ Linux.

В классе есть методы для добавления примитивных значений, а затем форматирования значений в соответствии со строкой форматирования. Более или менее инкапсуляция printf(...)

Мой класс выглядит так:

class Format
{
public:
    Format(string fmt);
    add(int16_t x);
    add(int32_t x);
    add(int64_t x);
    add(time_t x);
}

Когда я компилирую для 32-битного кода, код компилируется, потому что int64_t и time_t переводятся в разные типы. Если я скомпилирую для 64 бит, я получу:

ошибка: «Format :: add (time_t)» не может быть перегружен

Если я удаляю add(time_t x) Я получаю ошибку компиляции из 32-битного компилятора:

ошибка: вызов перегруженного ‘add (time_t &)’ неоднозначен

Я понимаю причины, по которым компиляция не удалась.

Но я не вижу лучшего решения этой проблемы?

Я бы не хотел приводить time_t к int64_t у вызывающей стороны.

Так как я могу реализовать это наилучшим образом для поддержки нескольких платформ?

У меня похожая проблема при добавлении версий перегрузки "long" и "int" в add (...).

С уважением Клаус

1 Ответ

0 голосов
/ 27 июня 2018

time_t чаще всего является 32-битным или 64-битным целым типом со знаком. (Его фактический тип не гарантируется стандартом C ++).

Если вы находитесь на платформе, где typedef имеет тот же фундаментальный тип, что и один из интегральных типов фиксированной ширины, то компилятор не сможет различать ваши функции.

Лучший обходной путь - взять листок из книги программиста на C и использовать

someMethod_time_t(time_t x)

и т. Д.

...