C++ 避免强制转换运算符()和访问运算符[]冲突

C++ 避免强制转换运算符()和访问运算符[]冲突,c++,casting,operator-overloading,typecasting-operator,C++,Casting,Operator Overloading,Typecasting Operator,我确信应该事先问一下,但我找不到 我有一个封装std::string的类,在这个类中,我想将typecast重载为char*和access操作符[] 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 op

我确信应该事先问一下,但我找不到

我有一个封装std::string的类,在这个类中,我想将typecast重载为char*和access操作符[]

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;
}
类字符串
{
公众:
字符串(const char*s){m_str=s;}
const char*str()const{return m_str.c_str();}
char*str(){return&m_str[0];}
字符运算符[](size_t pos)常量{return m_str[pos];}
字符和运算符[](size_t pos){return m_str[pos];}
运算符const char*()const{return str();}//cast运算符
运算符char*(){return str();}//cast运算符
受保护的:
std::字符串m_str;
};
void main()
{
字符串s=“1234”;
如果(s[0]!='1')/'String::operator[]”:4个重载具有类似的转换!!!!!

std::cout编译代码时始终启用警告,对于
gcc
clang
命令行选项是
-Wall-Wextra-Werror
。警告将告诉您
操作符[]
需要返回一个值


<表达式>代码> s [ 0 ] <代码>在32位模式<代码> CLAN/<代码>和<代码> MSVC 编译器考虑标准转换<代码> int <代码>索引>代码>未签名< /代码>(32位<代码> SIZEZT )与用户定义的从
String
char*
的转换级别相同。请参阅编译器错误消息。后一种用户定义转换的级别比任何标准转换的级别都差,但编译器无法解决此问题。我不确定此处究竟适用哪种标准规则

修复方法是添加另一个重载的
操作符[]
,该操作符接受有符号的
ptrdiff\u t
索引:

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

“…但它失败”--想显示错误吗?另外,打开警告。此外,你的许多代码都不是必需的,只是分散注意力,你需要为你的问题提取并提供一个答案。包括内联,而不是一堆“编辑:…”段落。哦,BTW,标题行不是用于标签的东西,而是删除C++。在代码段中,我给出了错误:“String::Tale[] ]:4个重载有类似的转换。@NathanOliver:这个问题应该重新打开,错误在32位模式下可以通过
clang-9
mscv
再现,请在x86上尝试,对我来说,它只在VS2017 x64中构建。这是一个更有趣的问题,我现在将删除我的答案。谢谢,Maxim。现在我看到解决方案是在运算符中使用int[]-您能再解释一下为什么它可以处理int而不能处理size\u t吗?我现在明白了,只有在必须升级到unsigned int(size\u t)时才会发生冲突,并且只适用于x86。