0

我在重载 << 运算符时遇到了一些问题。错误是这样的:'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;
}
4

3 回答 3

1

编译器在看到函数调用时只考虑它之前看到的函数,因此它看不到operator<<.cpp 文件中的函数。

您必须在operator<<某个地方进行前向声明,以便编译器知道它,例如在标题中:

std::ostream& operator<<(std::ostream&, const JSON&);

然后编译器在看到你调用它时就会知道该函数。

于 2012-11-16T13:49:35.587 回答
1

您需要在声明class 之后提供ostream& operator<<in声明:JSON.hppJSON

// JSON.hpp
....
class JSON
{
  // as before
};

std::ostream& operator<<(std::ostream& out, const JSON& json);
于 2012-11-16T13:50:24.897 回答
0

operator<<需要提供的声明main。放到头文件中。

于 2012-11-16T13:49:37.853 回答