在Jerry Coffin阅读question的答案之后,我将他的代码复制粘贴到我的编辑器中,经过一些小的编辑后,它编译并按照应该的方式运行。
以下是更改后的代码:
#include <iostream>
#include <string>
#include <istream>
#include <fstream>
class non_blank {
private:
std::string data_;
friend std::istream& operator>> (std::istream &is, non_blank &n) {
std::getline(is, n.data_);
if (n.data_.length() == 0) {
is.setstate(std::ios::failbit);
}
return is;
}
public:
operator std::string() const {
return data_;
}
};
int main(int, char *[]) {
non_blank line;
std::ifstream ifs("teste.txt");
while(ifs >> line) {
//std::cout << line; <----- error
std::string s = line;
std::cout << s << std::endl;
}
return 0;
}
尝试在std::cout <<...
表达式中使用non_blank变量时出错。我不应该在任何地方使用std :: string的变量使用non_blank类型的变量吗?这不是演员/转换运算符的目的吗? answer
为什么我无法直接在string::data_
的定义中访问私有变量operator >>
?
这是我得到的错误:
..\main.cpp: In function `std::istream& operator>>(std::istream&, non_blank&)':
..\main.cpp:21: error: invalid use of non-static data member `non_blank::data_'
..\main.cpp:26: error: from this location
答案 0 :(得分:1)
我不应该能够使用变量 我愿意在任何地方使用non_blank类型 使用std :: string?不是吗? 施法者的蠢事?
不完全。如果编译器看到你做了一些它知道需要std :: string的东西,它可以调用你的转换操作符来获取一个。但是在ostream运算符&lt;&lt;的情况下,它没有一个特定的函数可以调用,而是相当多的它们,都是不同的,没有一个与你打算打印的实际类型完全匹配。所以它列出了一大堆候选人,其中没有一个是足够强大的匹配。您需要定义一个ostream运算符&lt;&lt;对于你的类型,以使其打印应该。
对于您的运营商&gt;&gt;,您应该让它不是您班级的成员。如果必须,在类声明中将其声明为朋友,但在外部编写函数。