2011-08-08 46 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. 

這裏是src/jsonrpc_handler.cpp(我已經標線208和213) :

/* 
* 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行

response [(Json :: Value :: ArrayIndex)j] = ret; //線213

+0

呃,我不知道,向開發者彙報? –

+0

感謝您的評論... – Eamorr

+1

嘗試在第208行和第213行對「Json :: Value :: ArrayIndex」進行轉換。或者只是提交一個錯誤報告。 – slaphappy

回答

2

由於operator[]預計爲intJson::Value::ArrayIndex,您應該通過其中一個而不是size_t。我猜ArrayIndex也是簽名類型,或sizeof(size_t)>sizeof(ArrayIndex),所以size_t沒有很好的轉換爲intArrayIndex,因此它是不明確的。

也許向開發者發佈建議或瞭解不使用更習慣的size_t的動機。

1

在線路208

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

編譯器說i可以是intJson::Value::ArrayIndex(但它是爲size_t)。

從我可以找到有關JSON,該指數可能是

typedef unsigned int ArrayIndex; 

而且你的機器上size_t顯然不匹配。也許它是unsigned longunsigned long long

在這種情況下,我認爲可以通過關於丟失可移植性的錯誤報告。