【问题标题】:C++17 and Overloaded functionsC++17 和重载函数
【发布时间】:2020-04-08 20:32:44
【问题描述】:

我有这个项目,我正在尝试更新,以便可以在 VS2019 中使用 标头。当我将“C++ 语言标准”编译器选项从“默认”更改为“/std:c++17”时,以下代码会中断:

class ATL_NO_VTABLE CAPropertyPage :
{
public:
  struct INFO_STRUCT
  {
    INFO_STRUCT()
      : deviceType(0)
      , index(0)
    {
    };

    bool operator ==(const CAtlString &str)
    {
      return name.CompareNoCase(str) == 0;
    }

    bool operator ==(const CString &str)
    {
      return name.CompareNoCase(str) == 0;
    }

    bool operator ==(const INFO_STRUCT &is)
    {
      return name.CompareNoCase(is.name) == 0;
    }

    CString name;
    DWORD   deviceType;
    int     index;
  };
};

它使用 Default 编译得非常好,但使用 /std:c++17 我收到以下错误消息:

error C2535: 'bool CAPropertyPage::INFO_STRUCT::operator ==(const ATL::CAtlString &)': member function already defined or declared
message : see declaration of 'CAPropertyPage::INFO_STRUCT::operator =='

所以似乎不支持重载函数选项。 使用 /std:c++17 编译器选项时是否可能有重载函数?

【问题讨论】:

  • 你能给我们两个声明所在的行号吗?
  • This page 似乎相关。它提到了两种字符串类型。
  • 该错误表明CAtlStringCString 在C++17 下是完全相同的类型,但不是在默认值下。我建议完全摆脱CAtlString 重载,让调用者担心如果需要将任何CAtlString 对象转换为CString

标签: c++ c++17


【解决方案1】:

感谢 Remy Lebeau 的回答。 CString 和 CAtlString 在 C++17 中似乎是同一个东西。当我用 CAtlString 注释掉重载版本时,它会编译并允许第二次重载,因为它不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 2011-12-11
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    相关资源
    最近更新 更多