在成员调用中实例化类

时间:2012-08-21 11:51:37

标签: c++ oop

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

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);

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

谢谢

3 个答案:

答案 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类型的对象。