派生istringstream并实现运算符>>(字符串&)

时间:2013-05-23 21:00:14

标签: c++ templates inheritance multiple-inheritance

我正在处理以下情况: 我正在使用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的基本类型,我从istringstream继承。 但是通过实现我自己的运算符>>并通过扩展istringstream作为结果MyClass失去运算符>>对于基本类型。

1 个答案:

答案 0 :(得分:2)

  

怎么可能?! istringstream继承运算符>>对于来自istream的基本类型,我从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,其中包含上述更改。