C ++-避免强制转换operator()和access operator []冲突

问题描述 投票:1回答:1

我确定应该先询问它,但找不到。

我有一个封装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 ++标准中可能有所改变。

c++ casting operator-overloading stdstring typecasting-operator
1个回答
0
投票
您需要在启用警告的情况下编译代码,对于gccclang,命令行选项为-Wall -Wextra -Werror。警告将告诉您operator[]需要返回一个值。

修复:

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

© www.soinside.com 2019 - 2024. All rights reserved.