gpt4 book ai didi

c++ - 导出 istringstream 并实现 operator>>(string&)

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:28 24 4
gpt4 key购买 nike

我正在处理以下情况:我正在使用 istringstream 的 operator>> 在模板函数中提取格式化数据。一切都很好,除非使用具有空格的 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 继承。但是通过实现我自己的 operator>> 和扩展 istringstream 结果 MyClass 失去了基本类型的 operator>>。

最佳答案

How can it be ?! istringstream inherits operator>> for basic type from istream and I inherit from 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使用上述更改编译的代码。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com