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

クラスの宣言の後に、 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 に答える