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

C++ C++;:如何在两个不同的重载函数中使用具有两个不同名称的相同数据类型?,c++,visual-studio-2008,overloading,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:函数'std::string somet

我有以下声明,表明它在我的代码中使用了不同的操作:

typedef unsigned int SOMEIDTYPE;
现在,当我创建两个重载函数时:

string something(const unsigned int &val){ ... itoa(val) ... }
string something(const SOMEIDTYPE &val){ ... IDTABLE[val] ... }
我得到错误:
error C2084:函数'std::string something(const unsigned int&)'已经有一个主体了

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


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

它们不是不同的数据类型,
typedef
不会创建不同的类型,而是创建别名。因此,对于编译器来说,它看到两个具有相同名称的函数接受一个参数,两个参数的类型都相同。

使用强typedef。Boost有一个。标准typedef不足以满足此要求。

您不能。编译器使用方法签名来决定调用哪个方法。如果这些方法有相同的函数,编译器就无法理解。

A
typedef
只创建一个昵称,而不创建新类型

如果您真的想做这样的事情,那么您需要创建一个新类型。您可以为此创建一个类,但为了使该类的行为类似于
int
,您需要做一些工作:

class SOMEIDTYPE
{
public:
  SOMEIDTYPE();
  SOMEIDTYPE(const int&);
  SOMEIDTYPE& operator=(const SOMEIDTYPE&);
  operator int() const;
private:
  int val_;
};

现在您可以重载
SOMEIDTYPE

了,正如其他答案中提到的,这不起作用,因为
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.
    }
    

  • 要做到这一点,您必须将第二种类型包装在某种类型的类中,从我的头顶开始,类似于:

    struct SOMEIDTYPE
    {
        operator unsigned int&() { return _i;};
        SOMEIDTYPE(unsigned int ui):  _i(ui) {;};
        private:
        unsigned int _i;
    };
    

    这将创建一个可以按预期使用的独特类型。(BTW,我的C++有点生疏,所以语法可能有点偏离。)< /P>好的,那么我如何创建不同的数据类型,这样我就能使这个工作?@ NeBee- Noah Roberts的建议工作,使用。但我想知道你是不是在重载不共享相同行为保证的函数。事实上,只要你做了一两次并找出了所有的小问题,就没那么糟糕了。是val还是val?其他人也发布了类似的方法,但他使用的_valusing
    _val
    是不可取的,因为标准保留以下划线开头的标识符。但它几乎可以是你想要的任何东西
    val
    m\u val
    ILikePizza
    都很好。它产生了大量错误。。。我必须写下所有可能的操作吗,比如+++-/=*=那里?或者有什么捷径。。。我想看看所有这些应该如何声明的列表,这样我就不会写糟糕的代码是的,你必须写你使用的所有运算符。我可以问一下为什么相同的
    SOMEIDTYPE&operator=
    有两次吗?我必须把所有可能的组合变成
    int
    vs
    SOMEIDTYPE
    ?@John:是的,在一个全局范围内(这不是)@Newbie:在这个假设的情况下,SOMEIDYUPE不是
    typedef
    'd到int,它是分开的。因为你的两个方法似乎有不同的行为,你可能不应该重载。可以使用两个不同的函数名。如何在模板中使用两个不同的函数名?事实上,现在我是,因为我不能让它工作,因为++运算符很奇怪。尽管如此,我仍在努力实现这一点。typedef不会创建新类型。它只是为其他类型引入了一个替代名称