我正在处理以下情况: 我正在使用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失去运算符>>对于基本类型。
答案 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,其中包含上述更改。