我确定应该先询问它,但找不到。
我有一个封装std :: string的类,我想在其中将类型转换重载到char *和访问运算符[]。
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 { m_str[pos]; }
char& operator[](size_t pos) { 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重载具有相似的转换”,编译器无法决定要执行以下操作:1)直接使用重载运算符[]2)首先使用operator()转换为char *,然后通过char *数组转换为operator []
是否有办法保留这两个运算符?对于许多函数,等等。接受char *和const char *以使用String的operstor(),但在所有其他情况下,直接使用operator [](不尝试转换为char *)。
我想对此的回答可能是“否”,这就是为什么在[[std :: string中没有char *强制转换运算符,但是在最新的C ++标准中可能有所改变。
gcc
和clang
,命令行选项为-Wall -Wextra -Werror
。警告将告诉您operator[]
需要返回一个值。修复:
char operator[](size_t pos) const { return m_str[pos]; }
char& operator[](size_t pos) { return m_str[pos]; }