【发布时间】:2016-08-21 11:37:43
【问题描述】:
考虑以下类型:
#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 类型系统的乐趣!
-
是的,IMO 有点弱,因为 typedefs 的全部意义在于创建新类型,因此编译器应该能够正确区分它们以使其保持一致。我想这涉及到一些向后兼容性问题。
标签: c++ overloading