1

我有一个成员函数定义为:

void printSomeData(std::ostream& str) const;

当我尝试以这种方式从另一个类中调用该成员时:

myclass.printSomeData(std::ofstream("foo.txt"));

我收到以下错误:

错误:没有匹配函数调用'myclass::printSomeData(std::ofstream)'</p>

注意:没有已知的参数 1 从 'std::ofstream {aka std::basic_ofstream}' 到 'std::ostream& {aka std::basic_ostream&}' 的转换</p>

但是,如果我首先调用函数来实例化 ofstream,如下所示,我不会收到任何错误,我不太明白:

std::ofstream foo("foo.txt");
myclass.printSomeData(foo);

任何人都可以给我一个线索?

谢谢

4

3 回答 3

3

您不能将临时对象绑定到非常量引用,您在此处执行的操作是:

myclass.printSomeData(std::ofstream("foo.txt"));
                            ^ temporary std::ostream object

什么时候可以这样做:

std::ofstream os("foo.txt");
myclass.printSomeData(os);

您正在传递对现有std::ofstream对象的引用,而不是临时对象。

您也可以printSomeData参考const,但大概您想更改函数中的流。

于 2012-08-21T11:54:22.210 回答
1
void printSomeData(const std::ostream& str) const;
//                   |
//              notice const

临时对象不能绑定到非const引用,并std::ofstream("foo.txt")创建一个临时对象。

或者您可以为该函数提供一个非临时变量。

于 2012-08-21T11:53:11.993 回答
0
void printSomeData(std::ostream& str) const;

myclass.printSomeData(std::ofstream("foo.txt"));

您尝试传递给引用临时对象的函数(即尝试绑定rvaluelvalue-reference)。这是不正确的。可以用const std::ostream&,但不好用,std::ostream&&能用C++11也可以用。

void printSomeData(std::ostream&& str) const;
myclass.printSomeData(std::ofstream("foo.txt"));

但在这种情况下,您不能传递 ostream 类型的对象。

于 2012-08-21T11:55:00.327 回答