首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >派生istringstream并实现operator>>(string&)

派生istringstream并实现operator>>(string&)
EN

Stack Overflow用户
提问于 2013-05-24 05:00:14
回答 1查看 284关注 0票数 2

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

代码语言:javascript
复制
class MyClass : public istringstream{
public:
      MyClass(const char* st) : istringstream(st){}
      void operator>>(string& st){st = this->str();}
}

但现在我面临着这样的问题:

代码语言:javascript
复制
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>>。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-24 05:02:52

怎么会这样呢?!istringstream从istream继承基本类型的operator>>,我从istringstream继承。

您的operator >>重载会隐藏基类中的重载。您应该使用using声明来使基类中的operator >>重载参与重载解析:

代码语言:javascript
复制
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中解释了名称隐藏的概念及其对重载解析的影响(虽然本文主要讨论虚函数,但也讨论了您所面临的完全相同的问题)。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16723802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档