我有两个简单的类型定义为int:
typedef int type_a;
typedef int type_b;
我想为类中的每个类型创建一个构造函数。我尝试使用显式关键字,但它没有工作,我得到了一个编译消息"不能超载"。
class Test {
public:
explicit Test(type_a a){
}
explicit Test(type_b b){
}
};
将一种类型更改为无符号(typedef unsigned int type_b;)可以解决问题,但我真的希望保持两种类型的定义相同。
C ++可以处理这种情况吗?
答案 0 :(得分:8)
C ++可以处理这种情况吗?
简答:不。 typedef
是类型的别名。因此type_a
和type_b
的类型相同:int
。这意味着您正在尝试这样做:
class Test {
public:
explicit Test(int a) {}
explicit Test(int b) {}
};
由于不清楚为什么你想要这个,很难提出可行的解决方案。但是如果你要实现一个不同的整数类型,你就可以有一个单独的构造函数。
另请注意,explicit
与此无关。
答案 1 :(得分:2)
您拥有的一个选项是使用包含“域”的模板类型包装参数:
template <typename Type, typename Domain>
class TypeWrapper {
public:
TypeWrapper(Type);
operator Type ();
};
typedef int type_a;
typedef int type_b;
typedef TypeWrapper<type_a, class type_a_domain> type_a_wrapper;
typedef TypeWrapper<type_b, class type_b_domain> type_b_wrapper;
class Test {
public:
explicit Test(type_a_wrapper a);
explicit Test(type_b_wrapper b);
};