我遇到了一些问题,超载了<<运营商。 错误是这样的:'JSON'不是来自'const std :: basic_string< _CharT,_Traits,_Alloc>'
如何使运算符重载的正确方法<<。 我的目标是能够做std :: cout<
我的代码是: main.cpp中
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include "JSON.hpp"
int main()
{
std::cout<<"JSON V0.1"<<std::endl;
std::string line;
std::ifstream file;
std::stringstream ss;
JSON obj;
file.open("test.json");
if (file.is_open())
{
std::cout<<"File opened"<<std::endl;
ss << file.rdbuf();
obj.parse(ss);
file.close();
}
std::cout<<obj<<std::endl;
return 0;
}
JSON.hpp
#ifndef _JSON_H_
#define _JSON_H_
#include <string>
#include <sstream>
#include <boost/property_tree/ptree.hpp>
class JSON
{
public:
bool parse(std::stringstream &stream);
std::string get(std::string &key);
private:
boost::property_tree::ptree pt;
};
#endif
JSON.cpp
#include <boost/property_tree/json_parser.hpp>
#include "JSON.hpp"
bool JSON::parse(std::stringstream &stream)
{
boost::property_tree::read_json(stream, pt);
return true;
}
std::string JSON::get(std::string &key)
{
std::string rv = "null";
return rv;
}
std::ostream& operator<<(std::ostream& out, const JSON& json)
{
return out << "JSON" << std::endl;
}
答案 0 :(得分:1)
编译器只考虑它在看到函数调用之前看到的函数,因此它看不到.cpp文件中的operator<<
。
您必须在某处放置operator<<
的前向声明,以便编译器知道它,就像在标题中一样:
std::ostream& operator<<(std::ostream&, const JSON&);
然后编译器会在看到你调用它时知道该函数。
答案 1 :(得分:1)
在课程ostream& operator<<
声明后,您需要在JSON.hpp
中提供JSON
的声明:
// JSON.hpp
....
class JSON
{
// as before
};
std::ostream& operator<<(std::ostream& out, const JSON& json);
答案 2 :(得分:0)
operator<<
的声明需要提供给main
。把它放到头文件中。