C ++:如何在两个不同的重载函数中使用具有两个不同名称的相同数据类型?

时间:2010-11-24 19:58:18

标签: c++ visual-studio-2008 overloading

我有以下声明来区分它在我的代码中使用不同的操作:

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

那么,我如何重载此函数以区别地使用这两种不同的数据类型,并执行如上所示的不同操作?

编辑:重载的原因是我在模板函数中调用此函数。

6 个答案:

答案 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只为同一类型创建一个新名称。

有两种方法可以解决这个问题:

  1. 为重载提供不同的名称:

    string somethingInt(...)...
    string somethingID(...)...
    
  2. 使用新名称创建一个新的类/结构。为了使它像整数一样工作,你可以重载各种运算符。

    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 ++有点生疏,所以语法可能有点偏差。)