我有一个成员函数定义为:
void printSomeData(std::ostream& str) const;
当我尝试以这种方式从另一个班级调用该成员时:
myclass.printSomeData(std::ofstream("foo.txt"));
我收到以下错误:
错误:没有匹配的调用函数 “MyClass的:: printSomeData(标准:: ofstream的)”
注意:'std :: ofstream {aka的参数1没有已知的转换 std :: basic_ofstream}'到'std :: ostream& {又名 的std :: basic_ostream&安培;}”
但是,如果我首先调用该函数实例化下面的ofstream,我没有得到任何错误,我不太明白:
std::ofstream foo("foo.txt");
myclass.printSomeData(foo);
任何人都可以给我一个线索吗?
谢谢
答案 0 :(得分:3)
您无法将临时绑定到非const引用,您在此处执行此操作:
myclass.printSomeData(std::ofstream("foo.txt"));
^ temporary std::ostream object
什么时候可以这样做:
std::ofstream os("foo.txt");
myclass.printSomeData(os);
您正在传递对现有std::ofstream
对象的引用,而不是临时对象。
您还可以printSomeData
获取const
引用,但可能您想要更改函数中的流。
答案 1 :(得分:1)
void printSomeData(const std::ostream& str) const;
// |
// notice const
Temporaries无法绑定到非const
引用,std::ofstream("foo.txt")
会创建临时引用。
或者你可以为函数提供非临时性。
答案 2 :(得分:0)
void printSomeData(std::ostream& str) const;
myclass.printSomeData(std::ofstream("foo.txt"));
您尝试传递给参考临时对象的函数(即尝试将rvalue
绑定到lvalue-reference
)。这是不正确的。您可以使用const std::ostream&
,但这不好,如果您可以使用C ++ 11,也可以使用std::ostream&&
。
void printSomeData(std::ostream&& str) const;
myclass.printSomeData(std::ofstream("foo.txt"));
但是在这种情况下你不能传递ostream类型的对象。