2

我正在处理以下情况:我正在使用 istringstream 的 operator>> 在模板函数中提取格式化数据。除了使用有空间的 std::string 调用函数时,每件事都很好用。例如 std::string tmp("bla tmp"); 众所周知,有一个运算符>>(不是 istringstream 的成员)接受 istream 和字符串,并使用空格作为分隔符提取数据。所以我得到以下“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 继承 operator>> 的基本类型,而我从 istringstream 继承。但是通过实现我自己的 operator>> 并通过扩展 istringstream 结果 MyClass 失去了 operator>> 的基本类型。

4

1 回答 1

2

怎么可能 ?!istringstream 从 istream 继承 operator>> 的基本类型,而我从 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在这篇文章中解释了名称隐藏的概念以及它如何干扰重载解析(虽然这篇文章主要是关于虚函数,但它确实讨论了您所面临的完全相同的问题)。

最后,这是一个使用上述更改编译代码的实时示例。

于 2013-05-23T21:02:52.340 回答