我有以下声明来区分它在我的代码中使用不同的操作:
typedef unsigned int SOMEIDTYPE;
现在,当我创建两个重载函数时:
string something(const unsigned int &val){ ... itoa(val) ... }
string something(const SOMEIDTYPE &val){ ... IDTABLE[val] ... }
我收到错误:error C2084: function 'std::string something(const unsigned int &)' already has a body
那么,我如何重载此函数以区别地使用这两种不同的数据类型,并执行如上所示的不同操作?
编辑:重载的原因是我在模板函数中调用此函数。
答案 0 :(得分:4)
它们不是不同的数据类型,typedef
不会创建不同的类型,它会创建别名。因此,对于编译器,它看到两个具有相同名称的函数,它们采用相同的类型。
答案 1 :(得分:4)
使用强大的typedef。 Boost有一个。标准typedef不足以满足此要求。
答案 2 :(得分:2)
typedef
只会创建一个昵称 - 它不会创建新类型。
如果你真的想做这样的事情,那么你需要创建一个新类型。您可以为此目的创建一个类,但为了使该类的行为类似于int
,您需要做一些工作:
class SOMEIDTYPE
{
public:
SOMEIDTYPE();
SOMEIDTYPE(const int&);
SOMEIDTYPE& operator=(const SOMEIDTYPE&);
operator int() const;
private:
int val_;
};
现在您可以在SOMEIDTYPE
答案 3 :(得分:1)
你不能。编译器使用方法签名来决定调用哪个。如果方法具有相同的功能,则编译器无法弄清楚。
答案 4 :(得分:1)
正如其他答案所述,这不起作用,因为typedef
只为同一类型创建一个新名称。
有两种方法可以解决这个问题:
为重载提供不同的名称:
string somethingInt(...)...
string somethingID(...)...
使用新名称创建一个新的类/结构。为了使它像整数一样工作,你可以重载各种运算符。
struct SOMEIDTYPE {
private: int _val;
public:
SOMEIDTYPE & operator=(const SOMEIDTYPE &rhs) {
_val = rhs._val;
}
SOMEIDTYPE & operator=(const int &rhs) {
_val = rhs;
}
//etc.
}
答案 5 :(得分:0)
要做到这一点,你必须把第二种类型包装在某种类的类中,从头顶开始,例如:
struct SOMEIDTYPE
{
operator unsigned int&() { return _i;};
SOMEIDTYPE(unsigned int ui): _i(ui) {;};
private:
unsigned int _i;
};
这会创建一个您可以按预期使用的独特类型。 (顺便说一下,我的C ++有点生疏,所以语法可能有点偏差。)