考虑以下类型:
#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);
}
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试编译它时,我从编译器收到一个错误,告诉我std::string toString(clockval_t)已经有一个正文.我理解为什么会发生这种情况,因为typedef只是一个别名uword_t.
AFAIK唯一的解决方案是提供单独的方法:
std::string toClockString(clockval_t);
Run Code Online (Sandbox Code Playgroud)
或使它成为一个对象:
class clockval ...
Run Code Online (Sandbox Code Playgroud)
这是正确的还是有其他方法可以让编译器选择正确的重载?
即使有一种方法可以让编译器选择正确的版本,您是否意识到它会容易出错?幸运的是,没有这样的方法,因为typedef仅创建别名而已。
我建议你把它转换成类。如果您提供正确的构造函数和转换运算符,那么您甚至不需要更改使用以下内容的代码部分clockval_t:
class clockval_t {
public:
clockval_t(uword_t aValue) : value(aValue) {}
operator uword_t() const { return value; }
private:
uword_t value;
};
...
clockval_t time = 1023; // works fine
std::cout << time << std::endl; // works fine
std::cout << (time / 10) << std::endl; // works fine
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
187 次 |
| 最近记录: |