如何定义两个具有相同基类型的不同类型的C ++构造函数

时间:2015-01-19 10:13:47

标签: c++ constructor

我有两个简单的类型定义为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 ++可以处理这种情况吗?

2 个答案:

答案 0 :(得分:8)

  

C ++可以处理这种情况吗?

简答:不。 typedef是类型的别名。因此type_atype_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);
};