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