【问题标题】:Derive istringstream and implementing operator>>(string&)派生 istringstream 并实现 operator>>(string&)
【发布时间】:2013-05-23 21:00:13
【问题描述】:

我正在处理以下情况: 我正在使用 istringstream 的 operator>> 在模板函数中提取格式化数据。 除了使用有空间的 std::string 调用函数时,每件事都很好用。 例如std::string tmp("bla tmp"); 众所周知,有一个运算符>>(不是 istringstream 的成员)接受 istream 和字符串,并使用空格作为分隔符提取数据。 所以我得到以下“bla”而不是“bla tmp”。 长话短说,我试图变得老练,并做了以下事情:

class MyClass : public istringstream{
public:
      MyClass(const char* st) : istringstream(st){}
      void operator>>(string& st){st = this->str();}
}

但现在我面临这个问题:

MyClass my("bla tmp");
string tmp;
my >> tmp; // now tmp == "bla temp" and this is exactly what I wanted
//but this does not work
int kk;
my >> kk; //gives me "no match for operator>>"

怎么可能?! istringstream 从 istream 继承 operator>> 的基本类型,而我从 istringstream 继承。 但是通过实现我自己的 operator>> 并通过扩展 istringstream 结果 MyClass 失去了 operator>> 的基本类型。

【问题讨论】:

    标签: c++ templates inheritance multiple-inheritance


    【解决方案1】:

    怎么可能?! istringstream 从 istream 继承 operator>> 的基本类型,而我从 istringstream 继承。

    operator >> 的重载隐藏基类中的那个。您应该使用using 声明来使基类中operator >> 的重载参与重载决议:

    class MyClass : public std::istringstream {
    public:
        using std::istringstream::operator >>;
    //  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        MyClass(const char* st) : std::istringstream(st){}
        void operator>>(std::string& st){st = this->str();}
    };
    

    this article by Herb Sutter 中解释了名称隐藏的概念以及它如何干扰重载解析(虽然这篇文章主要是关于虚函数,但它确实讨论了您所面临的完全相同的问题)。

    最后,这里是您的代码的live example,使用上述更改进行编译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 2017-06-01
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      相关资源
      最近更新 更多