C++ 在成员调用中实例化类
我的成员函数定义为:C++ 在成员调用中实例化类,c++,oop,C++,Oop,我的成员函数定义为: void printSomeData(std::ostream& str) const; 当我尝试以这种方式从另一个类调用该成员时: myclass.printSomeData(std::ofstream(“foo.txt”) 我得到以下错误: 错误:没有用于调用的匹配函数 'myclass::printSomeData(std::ofstream)' 注意:从'std::of Stream{aka'到参数1没有已知的转换 std::basic_of stream
void printSomeData(std::ostream& str) const;
当我尝试以这种方式从另一个类调用该成员时:
myclass.printSomeData(std::ofstream(“foo.txt”)代码>
我得到以下错误:
错误:没有用于调用的匹配函数
'myclass::printSomeData(std::ofstream)'
注意:从'std::of Stream{aka'到参数1没有已知的转换
std::basic_of stream}'to'std::ostream&{aka
std::basic_ostream&}'
但是,如果我调用函数首先实例化ofstream,如下面所示,我不会得到任何错误,我并不真正理解:
std::ofstream foo("foo.txt");
myclass.printSomeData(foo);
有人能给我一个线索吗
多谢各位
void printSomeData(const std::ostream& str) const;
// |
// notice const
临时变量不能绑定到非const
引用,并且std::ofstream(“foo.txt”)
创建临时变量
或者,您可以为函数提供非临时值
临时变量不能绑定到非const
引用,并且std::ofstream(“foo.txt”)
创建临时变量
或者,您可以为函数提供非临时引用。您不能将临时引用绑定到非常量引用,您正在执行以下操作:
myclass.printSomeData(std::ofstream("foo.txt"));
^ temporary std::ostream object
何时可以改为执行此操作:
std::ofstream os("foo.txt");
myclass.printSomeData(os);
您正在传递对现有std::ofstream
对象的引用,而不是临时对象
您还可以使printSomeData
接受const
引用,但您可能希望更改函数中的流。您无法将临时引用绑定到非const引用,您正在执行以下操作:
myclass.printSomeData(std::ofstream("foo.txt"));
^ temporary std::ostream object
void printSomeData(std::ostream& str) const;
myclass.printSomeData(std::ofstream("foo.txt"));
何时可以改为执行此操作:
std::ofstream os("foo.txt");
myclass.printSomeData(os);
您正在传递对现有std::ofstream
对象的引用,而不是临时对象
您还可以使printSomeData
获取const
引用,但您可能希望更改函数中的流
void printSomeData(std::ostream& str) const;
myclass.printSomeData(std::ofstream("foo.txt"));
您尝试传递给引用临时对象的函数(即尝试将rvalue
绑定到lvalue引用
)。这是不正确的。您可以使用const std::ostream&
,但这并不好,如果您可以使用C++11,也可以使用std::ostream&&
void printSomeData(std::ostream&& str) const;
myclass.printSomeData(std::ofstream("foo.txt"));
但在这种情况下,不能传递类型为ostream的对象
您尝试传递给引用临时对象的函数(即尝试将rvalue
绑定到lvalue引用
)。这是不正确的。您可以使用const std::ostream&
,但这并不好,如果您可以使用C++11,也可以使用std::ostream&&
void printSomeData(std::ostream&& str) const;
myclass.printSomeData(std::ofstream("foo.txt"));
但在这种情况下,不能传递类型为ostream的对象