重载 fstream <<运算符以保存"any"类型的数据



我创建了具有公共变量 double x 的A test类。我已经超载了 ostream&lt;&lt; operatater能够打印出变量 x 。我还编写了一个外部保存(文件名,对象)函数,该函数将以特定的方式保存对象的内容。我想使用&lt;&lt;运算符将 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&lt;&lt;数据; 命令:

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;

您能帮我解决这个问题吗?谢谢您的宝贵时间。

您是通过非const引用的 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&
    ...
}

您会遇到错误

转弯

std::ostream& operator << (std::ostream& os, Test& p) {

进入

std::ostream& operator << (std::ostream& os, const Test& p) {

相关内容

最新更新