派生 istringstream 和实现运算符>>(string&)

Derive istringstream and implementing operator>>(string&)

本文关键字:gt string 派生 实现 运算符 istringstream      更新时间:2023-10-16

我正在处理以下情况:我使用istringstream的操作符>>在模板函数中提取格式化的数据。除了使用带有空格的std::string调用函数外,其他一切都很好。例如std::string tmp("bla tmp");大家都知道,有一个操作符>>(不是istringstream的成员),它接受istream和string,并使用空格作为分隔符提取数据。所以我得到下面的"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继承了用于基本类型的操作符>>,而I继承自istringstream。但是通过实现我自己的操作符>>和扩展istringstream, MyClass失去了基本类型的操作符>>

怎么可能呢?istringstream从istream继承了用于基本类型的操作符>>,而I继承自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();}
};

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

最后,这里是一个活例,您的代码使用上述更改进行编译。