Thread: [Jsonrpc-cpp-devel] Scons error: "ambiguous overload"
Brought to you by:
s-vincent
|
From: Eamonn H. <eam...@al...> - 2011-08-08 09:44:09
|
I hope someone can help me get jsonrpc-cpp to compile. When I type `scons` as per the documentation, I get: 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. Here is `src/jsonrpc_handler.cpp` (I've marked lines 208 and 213): /* * JsonRpc-Cpp - JSON-RPC implementation. * Copyright (C) 2008-2011 Sebastien Vincent <seb...@cp...> * * 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 */ I'm really hoping someone might be able to point me in the right direction. Many thanks in advance, |
|
From: Sebastien V. <seb...@cp...> - 2011-08-08 18:51:31
Attachments:
smime.p7s
|
Hi again, It is an error due to g++ 4.6. I have fixed it in SVN revision 58. Regards, -- Seb Le 08/08/2011 11:27, Eamonn Hynes a écrit : > I hope someone can help me get jsonrpc-cpp to compile. > > When I type `scons` as per the documentation, I get: > > 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. > > Here is `src/jsonrpc_handler.cpp` (I've marked lines 208 and 213): > > /* > * JsonRpc-Cpp - JSON-RPC implementation. > * Copyright (C) 2008-2011 Sebastien Vincent > <seb...@cp...> > * > * 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 */ > > I'm really hoping someone might be able to point me in the right > direction. > > Many thanks in advance, > > > ------------------------------------------------------------------------------ > BlackBerry® DevCon Americas, Oct. 18-20, San Francisco, CA > The must-attend event for mobile developers. Connect with experts. > Get tools for creating Super Apps. See the latest technologies. > Sessions, hands-on labs, demos& much more. Register early& save! > http://p.sf.net/sfu/rim-blackberry-1 > > > _______________________________________________ > Jsonrpc-cpp-devel mailing list > Jso...@li... > https://lists.sourceforge.net/lists/listinfo/jsonrpc-cpp-devel |
|
From: Sebastien V. <seb...@cp...> - 2011-08-08 23:21:05
|
Hi,
What is your environment (OS, g++ version, jsoncpp version, ...) ?
--
Seb
On Mon, 8 Aug 2011 10:27:11 +0100 (IST), Eamonn Hynes
<eam...@al...> wrote:
> I hope someone can help me get jsonrpc-cpp to compile.
>
> When I type `scons` as per the documentation, I get:
>
> 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.
>
> Here is `src/jsonrpc_handler.cpp` (I've marked lines 208 and 213):
>
> /*
> * JsonRpc-Cpp - JSON-RPC implementation.
> * Copyright (C) 2008-2011 Sebastien Vincent
> *
> * 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 .
> */
>
> /**
> * 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(*this, &Handler::SystemDescribe,
> std::string("system.describe"), root));
> }
>
> Handler::~Handler()
> {
> /* delete all objects from the list */
> for(std::list::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::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::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::const_iterator it = m_methods.begin() ; it !=
> m_methods.end() ; it++)
> {
> if((*it)->GetName() == name)
> {
> return (*it);
> }
> }
>
> return 0;
> }
>
> } /* namespace Rpc */
>
> } /* namespace Json */
>
> I'm really hoping someone might be able to point me in the right
> direction.
>
> Many thanks in advance,
|
|
From: Eamonn H. <eam...@al...> - 2011-08-08 16:35:14
|
Hi,
Many thanks for the message.
I'm on Ubuntu Linux, 64-bit, g++ 4.5.2.
I think I've managed to solve this problem:
Here's what I did on lines 208 and 213 - I just casted the indexes:
Process(root[(Json::Value::ArrayIndex)i], ret); //line 208
response[(Json::Value::ArrayIndex)j] = ret; //line 213
Hope this helps,
Eamonn
----- Original Message -----
From: "Sebastien Vincent" <seb...@cp...>
To: "Eamonn Hynes" <eam...@al...>
Cc: jso...@li...
Sent: Monday, 8 August, 2011 5:14:26 PM
Subject: Re: [Jsonrpc-cpp-devel] Scons error: "ambiguous overload"
Hi,
What is your environment (OS, g++ version, jsoncpp version, ...) ?
--
Seb
On Mon, 8 Aug 2011 10:27:11 +0100 (IST), Eamonn Hynes
<eam...@al...> wrote:
> I hope someone can help me get jsonrpc-cpp to compile.
>
> When I type `scons` as per the documentation, I get:
>
> 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.
>
> Here is `src/jsonrpc_handler.cpp` (I've marked lines 208 and 213):
>
> /*
> * JsonRpc-Cpp - JSON-RPC implementation.
> * Copyright (C) 2008-2011 Sebastien Vincent
> *
> * 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 .
> */
>
> /**
> * 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(*this, &Handler::SystemDescribe,
> std::string("system.describe"), root));
> }
>
> Handler::~Handler()
> {
> /* delete all objects from the list */
> for(std::list::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::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::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::const_iterator it = m_methods.begin() ; it !=
> m_methods.end() ; it++)
> {
> if((*it)->GetName() == name)
> {
> return (*it);
> }
> }
>
> return 0;
> }
>
> } /* namespace Rpc */
>
> } /* namespace Json */
>
> I'm really hoping someone might be able to point me in the right
> direction.
>
> Many thanks in advance,
|