使用typedef重载会产生错误

Dev*_*lus 7 c++ overloading

考虑以下类型:

#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)

这是正确的还是有其他方法可以让编译器选择正确的重载?

gud*_*dok 2

即使有一种方法可以让编译器选择正确的版本,您是否意识到它会容易出错?幸运的是,没有这样的方法,因为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)