【问题标题】:Overloading member methods with typedef aliases as parameters使用 typedef 别名作为参数重载成员方法
【发布时间】:2012-05-14 11:33:45
【问题描述】:

我在 C++ 中重载方法时遇到了一些问题。

typedef char int8_t;
class SomeClass{
public:
…
void Method(int8_t paramater);
void Method(char paramater);
};

由于 int8_t 是 typedef 和 char 一样,它们只是别名,它们可能引用相同的类型,在这种情况下重载将不起作用。

我想让它们同时工作?你能提出相同的解决方案吗? 注意:我不想添加模板化方法。

以下是错误:

错误:SomeClass::Method(char) 的多重声明

【问题讨论】:

  • 如果两者对编译器的签名完全相同,编译器将如何区分它们?

标签: c++ compiler-errors overloading


【解决方案1】:

使用人造字体。将charint8_t 之一包装在一个结构中并将该结构用作参数。

【讨论】:

  • 不幸的是我不能,因为我正在使用来自 solaris 平台 int_types.h 的这个 typedef
  • 你可以使用类似:struct faux_int8_t{ int8_t x;};
  • 由于我使用的是来自 solaris 平台 int_types.h 的 typedef,因此我无法使用您提到的上述结构。
  • @user1393608 然后执行typedef struct {char x;} faux_char;。除非您的特定平台不支持结构,否则这在 C 和 C++ 中都可以正常工作。
【解决方案2】:

...它们可能引用相同的类型,在这种情况下重载不会 工作。我想让它们同时工作吗?

幸运的是,这是不可能的(即使是 templates)。因为它扼杀了typedef 的目的。
如果您打算在您的代码中执行此操作,那么它就是 代码气味;你可能不得不改变你的设计。

【讨论】:

    【解决方案3】:

    您可能会通过尝试以下方式获得一定程度的改进:

    void Method(char paramater);
    void Method(signed char paramater);
    void Method(unsigned char paramater);
    

    如果一个实现定义了int8_t,并且如果定义匹配这三个之一,那么正确的函数将被调用。

    然而,一个狡猾的实现可能会做这样的事情:

    typedef __special_secret_sauce int8_t;
    

    然后您需要为int8_t 定义另一个重载。你很难为int8_t 定义另一个重载来应对这些实现,同时又不为将int8_t 定义为signed char 的实现定义它。有人说这根本不可能。

    可能存在int8_t 根本不存在的实现。如果您只是为 char 的三种变体定义重载,那么您将没有问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-17
      • 2023-01-08
      • 1970-01-01
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      相关资源
      最近更新 更多