Рассмотрит следующие типы:перегрузки с ЬурейиМ выдает ошибку
#include <iostream>
typedef unsigned long long usize_t;
typedef unsigned __int16 uword_t;
typedef uword_t clockval_t; // time without seconds in format HHMM
std::string toString(clockval_t nClock)
{
return std::to_string((usize_t)nClock/100) + ":" + std::to_string((usize_t)nClock % 100);
}
std::string toString(uword_t nValue)
{
return std::to_string((usize_t)nValue);
}
void test(void)
{
uword_t val = 1;
clockval_t time = 1023; // 10:23
std::cout << "Value: " << toString(val);
std::cout << "time: " << toString(time);
}
Теперь, когда я пытаюсь скомпилировать это я получаю сообщение об ошибке от компилятора говорил мне, что std::string toString(clockval_t)
уже есть тело. Я понимаю, почему это происходит, конечно, потому что typedef - это просто псевдоним для uword_t
.
AFAIK единственные решения должны обеспечить отдельный метод:
std::string toClockString(clockval_t);
или сделать его объект:
class clockval ...
Правильно ли это или есть какой-то другой способ сделать компилятор выбрать правильная перегрузка?
Ах, радости системы типа C! – Sean
Да, это ИМО немного слабее, потому что весь смысл typedefs заключается в создании новых типов, поэтому компилятор должен иметь возможность правильно различать их, чтобы сделать его последовательным. Тем не менее, я думаю, что есть некоторые проблемы обратной совместимости. – Devolus