我正在处理以下情况:
我正在使用istringstream的operator >>提取模板函数中的格式化数据。
除非使用带空格的std::string调用该函数,否则一切工作都很好。
例如std::string tmp(“bla tmp”);
众所周知,这里有一个运算符>>(不是istringstream的成员),它接受istream和string并使用空格作为定界符来提取数据。
因此,我得到以下“bla”而不是“bla tmp”。
为了使ling故事简短,我尝试变得精明,并执行以下操作:

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 >>。

最佳答案



您对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代码。

关于c++ - 派生istringstream并实现运算符>>(string&),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16723802/

10-10 16:33