2011-08-08 8 views
-1

誰かがjsonrpc-cppをコンパイルする手助けをしてくれることを願っています。 (http://jsonrpc-cpp.sourceforge.net/)C++:Sconsエラー: "あいまいなオーバーロード"

私はドキュメントごとにsconsを入力すると、私が手に:ここ

[email protected]:~/Desktop/jsonrpc-cpp$ scons 
scons: Reading SConscript files ... 
scons: done reading SConscript files. 
scons: Building targets ... 
g++ -o src/jsonrpc_handler.os -c -std=c++98 -Wall -Wextra -pedantic -Wredundant-decls -Wshadow -Werror -O2 -fPIC src/jsonrpc_handler.cpp 
src/jsonrpc_handler.cpp: In member function ‘bool Json::Rpc::Handler::Process(const std::string&, Json::Value&)’: 
src/jsonrpc_handler.cpp:208:25: error: ambiguous overload for ‘operator[]’ in ‘root[i]’ 
/usr/local/include/json/value.h:322:14: note: candidates are: Json::Value& Json::Value::operator[](Json::Value::ArrayIndex) 
/usr/local/include/json/value.h:329:14: note:     Json::Value& Json::Value::operator[](int) 
/usr/local/include/json/value.h:334:20: note:     const Json::Value& Json::Value::operator[](Json::Value::ArrayIndex) const 
/usr/local/include/json/value.h:339:20: note:     const Json::Value& Json::Value::operator[](int) const 
src/jsonrpc_handler.cpp:213:23: error: ambiguous overload for ‘operator[]’ in ‘response[j]’ 
/usr/local/include/json/value.h:322:14: note: candidates are: Json::Value& Json::Value::operator[](Json::Value::ArrayIndex) 
/usr/local/include/json/value.h:329:14: note:     Json::Value& Json::Value::operator[](int) 
/usr/local/include/json/value.h:334:20: note:     const Json::Value& Json::Value::operator[](Json::Value::ArrayIndex) const 
/usr/local/include/json/value.h:339:20: note:     const Json::Value& Json::Value::operator[](int) const 
scons: *** [src/jsonrpc_handler.os] Error 1 
scons: building terminated because of errors. 

は(私はライン208および213をマークした)src/jsonrpc_handler.cppです:

/* 
* JsonRpc-Cpp - JSON-RPC implementation. 
* Copyright (C) 2008-2011 Sebastien Vincent <[email protected]> 
* 
* This program is free software: you can redistribute it and/or modify 
* it under the terms of the GNU Lesser General Public License as published by 
* the Free Software Foundation, either version 3 of the License, or 
* (at your option) any later version. 
* 
* This program is distributed in the hope that it will be useful, 
* but WITHOUT ANY WARRANTY; without even the implied warranty of 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
* GNU Lesser General Public License for more details. 
* 
* You should have received a copy of the GNU Lesser General Public License 
* along with this program. If not, see <http://www.gnu.org/licenses/>. 
*/ 

/** 
* \file jsonrpc_handler.cpp 
* \brief JSON-RPC server processor engine. 
* \author Sebastien Vincent 
*/ 

#include "jsonrpc_handler.h" 

namespace Json 
{ 

    namespace Rpc 
    { 

    CallbackMethod::~CallbackMethod() 
    { 
    } 

    Handler::Handler() 
    { 
     /* add a RPC method that list the actual RPC methods contained in the Handler */ 
     Json::Value root; 

     root["description"] = "List the RPC methods available"; 
     root["parameters"] = Json::Value::null; 
     root["returns"] = "Object that contains description of all methods registered"; 

     AddMethod(new RpcMethod<Handler>(*this, &Handler::SystemDescribe, std::string("system.describe"), root)); 
    } 

    Handler::~Handler() 
    { 
     /* delete all objects from the list */ 
     for(std::list<CallbackMethod*>::const_iterator it = m_methods.begin() ; it != m_methods.end() ; it++) 
     { 
     delete (*it); 
     } 
     m_methods.clear(); 
    } 

    void Handler::AddMethod(CallbackMethod* method) 
    { 
     m_methods.push_back(method); 
    } 

    void Handler::DeleteMethod(const std::string& name) 
    { 
     /* do not delete system defined method */ 
     if(name == "system.describe") 
     { 
     return; 
     } 

     for(std::list<CallbackMethod*>::iterator it = m_methods.begin() ; it != m_methods.end() ; it++) 
     { 
     if((*it)->GetName() == name) 
     { 
      delete (*it); 
      m_methods.erase(it); 
      break; 
     } 
     } 
    } 

    bool Handler::SystemDescribe(const Json::Value& msg, Json::Value& response) 
    { 
     Json::Value methods; 
     response["jsonrpc"] = "2.0"; 
     response["id"] = msg["id"]; 

     for(std::list<CallbackMethod*>::iterator it = m_methods.begin() ; it != m_methods.end() ; it++) 
     { 
     methods[(*it)->GetName()] = (*it)->GetDescription(); 
     } 

     response["result"] = methods; 
     return true; 
    } 

    std::string Handler::GetString(Json::Value value) 
    { 
     return m_writer.write(value); 
    } 

    bool Handler::Check(const Json::Value& root, Json::Value& error) 
    { 
     Json::Value err; 

     /* check the JSON-RPC version => 2.0 */ 
     if(!root.isObject() || !root.isMember("jsonrpc") || root["jsonrpc"] != "2.0") 
     { 
     error["id"] = Json::Value::null; 
     error["jsonrpc"] = "2.0"; 

     err["code"] = INVALID_REQUEST; 
     err["message"] = "Invalid JSON-RPC request."; 
     error["error"] = err; 
     return false; 
     } 

     if(root.isMember("id") && (root["id"].isArray() || root["id"].isObject())) 
     { 
     error["id"] = Json::Value::null; 
     error["jsonrpc"] = "2.0"; 

     err["code"] = INVALID_REQUEST; 
     err["message"] = "Invalid JSON-RPC request."; 
     error["error"] = err; 
     return false; 
     } 

     /* extract "method" attribute */ 
     if(!root.isMember("method") || !root["method"].isString()) 
     { 
     error["id"] = Json::Value::null; 
     error["jsonrpc"] = "2.0"; 

     err["code"] = INVALID_REQUEST; 
     err["message"] = "Invalid JSON-RPC request."; 
     error["error"] = err; 
     return false; 
     } 

     return true; 
    } 

    bool Handler::Process(const Json::Value& root, Json::Value& response) 
    { 
     Json::Value error; 
     std::string method; 

     if(!Check(root, error)) 
     { 
     response = error; 
     return false; 
     } 

     method = root["method"].asString(); 

     if(method != "") 
     { 
     CallbackMethod* rpc = Lookup(method); 
     if(rpc) 
     { 
      return rpc->Call(root, response); 
     } 
     } 

     /* forge an error response */ 
     response["id"] = root.isMember("id") ? root["id"] : Json::Value::null; 
     response["jsonrpc"] = "2.0"; 

     error["code"] = METHOD_NOT_FOUND; 
     error["message"] = "Method not found."; 
     response["error"] = error; 

     return false; 
    } 

    bool Handler::Process(const std::string& msg, Json::Value& response) 
    { 
     Json::Value root; 
     Json::Value error; 
     bool parsing = false; 

     /* parsing */ 
     parsing = m_reader.parse(msg, root); 

     if(!parsing) 
     { 
     /* request or batched call is not in JSON format */ 
     response["id"] = Json::Value::null; 
     response["jsonrpc"] = "2.0"; 

     error["code"] = PARSING_ERROR; 
     error["message"] = "Parse error."; 
     response["error"] = error; 
     return false; 
     } 

     if(root.isArray()) 
     { 
     /* batched call */ 
     size_t i = 0; 
     size_t j = 0; 

     for(i = 0 ; i < root.size() ; i++) 
     { 
      Json::Value ret; 
      Process(root[i], ret); //line 208! 

      if(ret != Json::Value::null) 
      { 
      /* it is not a notification, add to array of responses */ 
      response[j] = ret; //line 213! 
      j++; 
      } 
     } 
     return true; 
     } 
     else 
     { 
     return Process(root, response); 
     } 
    } 

    bool Handler::Process(const char* msg, Json::Value& response) 
    { 
     std::string str(msg); 

     return Process(str, response); 
    } 

    CallbackMethod* Handler::Lookup(const std::string& name) const 
    { 
     for(std::list<CallbackMethod*>::const_iterator it = m_methods.begin() ; it != m_methods.end() ; it++) 
     { 
     if((*it)->GetName() == name) 
     { 
      return (*it); 
     } 
     } 

     return 0; 
    } 

    } /* namespace Rpc */ 

} /* namespace Json */ 

私は本当に誰かが正しい方向に私を向けることができると思っています。事前に

多くのおかげで、


編集:ここで私はライン208と213にやったことだ:

プロセス(ルート[(JSON ::バリュー:: ArrayIndex)i]と、RET) ; //行208

レスポンス[(Json :: Value :: ArrayIndex)j] = ret; //行213

+0

ええ、私はそれを開発者に報告していますか? –

+0

コメントありがとうございました... – Eamorr

+1

208行目と213行目で 'Json :: Value :: ArrayIndex'にキャストしようとするか、単にバグレポートを提出してください。 – slaphappy

答えて

2

operator[]は、intまたはJson::Value::ArrayIndexのいずれかを受け取るため、size_tの代わりに1つを渡す必要があります。 ArrayIndexも符号付きタイプ、つまりsizeof(size_t)>sizeof(ArrayIndex)なので、size_tの変換はintまたはArrayIndexのいずれにもなりません。したがって、あいまいです。

多分、開発者に提案を投稿したり、もっと慣用的なものを使用しないという動機を知ることがありますsize_t

1
行で
Process(root[i], ret); //line 208! 

コンパイラはiintまたはJson::Value::ArrayIndexのいずれかになります(それはsize_t型である)ことを言います。

私はJSONについては見つけることができるものから、インデックスが

typedef unsigned int ArrayIndex; 

そして、あなたのマシン上に置くことができsize_t、明らかにそれと一致していません。おそらくそれはunsigned longまたはunsigned long longですか?

その場合、移植性の欠如に関するバグレポートが出ることがあります。

関連する問題