gpt4 book ai didi

c++ - 如何避免 cast operator() 和 access operator[] 冲突?

转载 作者:行者123 更新时间:2023-11-30 04:41:59 26 4
gpt4 key购买 nike

我确定之前有人问过它,但我找不到。

我有一个类封装std::string。在内部,我想将类型转换重载到 char* 和访问 operator[]

class String
{
public :
String(const char* s) { m_str = s; }
const char* str() const { return m_str.c_str(); }
char* str() { return &m_str[0]; }
char operator[](size_t pos) const { return m_str[pos]; }
char& operator[](size_t pos) { return m_str[pos]; }
operator const char*() const { return str(); } // cast operator
operator char*() { return str(); } // cast operator
protected:
std::string m_str;
};

void main()
{
String s = "1234";
if(s[0] != '1') //'String::operator []': 4 overloads have similar conversions !!!!!
std::cout << "Error" << endl;
}

当然,当我尝试使用 String [] 时,问题出在我收到错误消息:

4 overloads have similar conversions

编译器无法决定要做什么:

  1. 直接使用重载operator[]
  2. 首先转换为 char*,使用 operator(),最后 operator[] 覆盖生成的 char*数组

有什么方法可以保留这两个运算符(operator)吗?对于许多功能,拥有char*const char* 对使用Stringoperator() 非常有帮助> 但在所有其他情况下直接使用 operator[](不首先尝试转换为 char*)。

我想这个问题的答案可能是。这就是为什么在 std::string 中没有 char* 转换运算符,但也许有些东西已经改变了更新的 C++ 标准?

编辑:我可以用 GCC 编译上面的代码,但在 VS (x86) 上编译失败。

Error C2666 'String::operator []': 4 overloads have similar conversions

最佳答案

始终在启用警告的情况下编译代码,对于 gccclang,命令行选项是 -Wall -Wextra -Werror。警告会告诉您 operator[] 需要返回一个值。


在 32 位模式 clangmsvc 的表达式 s[0] 中,编译器考虑标准转换 int 索引到 unsigned(32 位 size_t)与用户定义的转换具有相同的级别Stringchar*。查看编译器错误消息 here .后一种转换是用户定义的转换,其等级低于任何标准转换,但编译器无法解决这种关系。我不确定这里适用哪个标准规则。

一个修复方法是添加另一个 operator[] 的重载,它接受一个签名的 ptrdiff_t 索引:

char operator[](ptrdiff_t pos) const { return m_str[pos]; }
char& operator[](ptrdiff_t pos) { return m_str[pos]; }

关于c++ - 如何避免 cast operator() 和 access operator[] 冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58983118/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com