C++:错误:"ambiguous overload"
C++: Scons error: "ambiguous overload"
我希望有人能帮我得到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[]
期望int
或Json::Value::ArrayIndex
,您应该传递其中一个而不是size_t
。我猜ArrayIndex
也是一个有符号的类型,或者sizeof(size_t)>sizeof(ArrayIndex)
,所以size_t
不能很好地转换为int
或ArrayIndex
,因此它是模糊的。
可以给开发人员一个建议,或者找出不使用更习惯的size_t
的动机。
第208行
Process(root[i], ret); //line 208!
编译器说i
可以是int
或Json::Value::ArrayIndex
(但它是size_t)。
从我能找到的Json,索引可以是
typedef unsigned int ArrayIndex;
在你的机器上,size_t
显然不匹配。也许是unsigned long
或unsigned long long
?
在这种情况下,我认为是时候发布一个关于缺少可移植性的bug报告了。
相关文章:
- 模板规范获取'Ambiguous call to overloaded function'
- c++ const mysqlpp::String ambiguous error
- C++ "error: use of overloaded operator '*' is ambiguous"似乎只有一场比赛
- 在C++中,是否可以"overload"作为另一个类成员的对象?
- 为什么即使我定义了它们"no matching overload found"也会出现错误
- 为什么将"<<"运算符作为函数调用会导致"ambiguous call"编译器错误?
- OVerload函数调用问题
- "Ambiguous conversion sequence" - 这个概念的目的是什么?
- 如何修复"error: call to 'abs' is ambiguous"
- "call to 'triangle' is ambiguous"错误
- std::function std::bind with lambda overload ambiguity
- 为什么成员函数调用"ambiguous"?
- C++中的继承,"...is an ambiguous base of ..."错误
- GNU 电台出错:"reference to ‘uhd’ is ambiguous"
- 3D 矢量 - "No instance of overload function?"
- 为什么在std::overload而不是concepts/constexpr如果在std::visit中?
- C++如何"overload"模板以同时适用于值和类型?
- "Ambiguous Overload"回路中的问题和故障 CIN
- C++:错误:"ambiguous overload"
- "ambiguous overload for 'operator<<'" *没有*包罗万象的重载