C++:错误:"ambiguous overload"

C++: Scons error: "ambiguous overload"

本文关键字:ambiguous overload 错误 C++      更新时间:2023-10-16

我希望有人能帮我得到jsonrpc-cpp编译。(http://jsonrpc-cpp.sourceforge.net/)

当我按照文档输入scons时,我得到:

eamorr@Compaq6000:~/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 <sebastien.vincent@cppextrem.com>
 *
 *  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)我),随著;//208行

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

由于operator[]期望intJson::Value::ArrayIndex,您应该传递其中一个而不是size_t。我猜ArrayIndex也是一个有符号的类型,或者sizeof(size_t)>sizeof(ArrayIndex),所以size_t不能很好地转换为intArrayIndex,因此它是模糊的。

可以给开发人员一个建议,或者找出不使用更习惯的size_t的动机。

第208行

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

编译器说i可以是intJson::Value::ArrayIndex(但它是size_t)。

从我能找到的Json,索引可以是

typedef unsigned int ArrayIndex;

在你的机器上,size_t显然不匹配。也许是unsigned longunsigned long long ?

在这种情况下,我认为是时候发布一个关于缺少可移植性的bug报告了。