重载 fstream << 运算符以保存 "any" 种数据
Overloading fstream << operator to save "any" kind of data
我创建了一个 测试 class,它有一个 public 变量 double x。我已经重载了 ostream << 运算符,以便能够打印出变量 x。我还编写了一个外部 save(filename, object) 函数,它将以特定方式保存对象的内容。我想使用 << 运算符将 x 的内容保存到文件中。
头文件 (TestH.hpp) 如下所示:
#ifndef TESTH_HPP_
#define TESTH_HPP_
#include <iostream>
#include <fstream>
#include <string>
class Test {
public:
double x;
friend std::ostream& operator << (std::ostream& os, Test& p);
inline Test();
inline virtual ~Test();
};
inline std::ostream& operator << (std::ostream& os, Test& p);
template <class V>
inline void save(const std::string& pname, const V& data);
#endif /* TESTH_HPP_ */
这是定义函数的文件(TestC.cpp):
#ifndef TESTC_CPP_
#define TESTC_CPP_
#include "TestH.hpp"
Test::Test() {
x=10;
}
Test::~Test() {}
std::ostream& operator << (std::ostream& os, Test& p) {
// Output to screen
os << "Test:\t";
os << p.x;
return os;
}
template <class V>
void save(const std::string& pname, const V& data) {
std::ofstream myfile;
myfile.open(pname.c_str());
myfile << data;
myfile.close();
std::cout << "====== File is saved! ======\nPathname: " << pname << std::endl;
}
#endif /* TESTC_CPP_ */
最后是测试保存功能的代码 (Test.cpp):
#include <iostream>
#include "TestC.cpp"
int main () {
std::string fn = "test.txt";
int i=1;
Test a;
// std::cout << a;
save(fn,a);
return 0;
}
我得到了一个很长的错误列表,但基本上是说在 TestC.cpp 代码中,编译器无法执行 myfile << data; 命令:
In file included from ../Test.cpp:3:0:
../TestC.cpp:33:9: note: ‘const Test’ is not derived from ‘const std::basic_string<_CharT, _Traits, _Alloc>’
myfile << data;
你能帮我解决这个问题吗?谢谢你的时间。
您正在通过非常量引用流式传输 Test
:
friend std::ostream& operator << (std::ostream& os, Test& p);
您想通过 const 引用流式传输它:
friend std::ostream& operator << (std::ostream& os, const Test& p);
^^^^^^
错误来自这样一个事实,即当您从 save()
调用它时,您正在传递一个 const 引用:
template <class V>
void save(const std::string& pname, const V& data) {
...
myfile << data; // <== data is const Test&
...
}
您收到错误是因为您试图保存一个 const 对象,并且您为非 const 情况重载了运算符。
转
std::ostream& operator << (std::ostream& os, Test& p) {
进入
std::ostream& operator << (std::ostream& os, const Test& p) {
我创建了一个 测试 class,它有一个 public 变量 double x。我已经重载了 ostream << 运算符,以便能够打印出变量 x。我还编写了一个外部 save(filename, object) 函数,它将以特定方式保存对象的内容。我想使用 << 运算符将 x 的内容保存到文件中。 头文件 (TestH.hpp) 如下所示:
#ifndef TESTH_HPP_
#define TESTH_HPP_
#include <iostream>
#include <fstream>
#include <string>
class Test {
public:
double x;
friend std::ostream& operator << (std::ostream& os, Test& p);
inline Test();
inline virtual ~Test();
};
inline std::ostream& operator << (std::ostream& os, Test& p);
template <class V>
inline void save(const std::string& pname, const V& data);
#endif /* TESTH_HPP_ */
这是定义函数的文件(TestC.cpp):
#ifndef TESTC_CPP_
#define TESTC_CPP_
#include "TestH.hpp"
Test::Test() {
x=10;
}
Test::~Test() {}
std::ostream& operator << (std::ostream& os, Test& p) {
// Output to screen
os << "Test:\t";
os << p.x;
return os;
}
template <class V>
void save(const std::string& pname, const V& data) {
std::ofstream myfile;
myfile.open(pname.c_str());
myfile << data;
myfile.close();
std::cout << "====== File is saved! ======\nPathname: " << pname << std::endl;
}
#endif /* TESTC_CPP_ */
最后是测试保存功能的代码 (Test.cpp):
#include <iostream>
#include "TestC.cpp"
int main () {
std::string fn = "test.txt";
int i=1;
Test a;
// std::cout << a;
save(fn,a);
return 0;
}
我得到了一个很长的错误列表,但基本上是说在 TestC.cpp 代码中,编译器无法执行 myfile << data; 命令:
In file included from ../Test.cpp:3:0:
../TestC.cpp:33:9: note: ‘const Test’ is not derived from ‘const std::basic_string<_CharT, _Traits, _Alloc>’
myfile << data;
你能帮我解决这个问题吗?谢谢你的时间。
您正在通过非常量引用流式传输 Test
:
friend std::ostream& operator << (std::ostream& os, Test& p);
您想通过 const 引用流式传输它:
friend std::ostream& operator << (std::ostream& os, const Test& p);
^^^^^^
错误来自这样一个事实,即当您从 save()
调用它时,您正在传递一个 const 引用:
template <class V>
void save(const std::string& pname, const V& data) {
...
myfile << data; // <== data is const Test&
...
}
您收到错误是因为您试图保存一个 const 对象,并且您为非 const 情况重载了运算符。
转
std::ostream& operator << (std::ostream& os, Test& p) {
进入
std::ostream& operator << (std::ostream& os, const Test& p) {