【发布时间】:2016-06-12 23:04:18
【问题描述】:
几周前,我在我的 Windows Notebook 上基于 C++ 和 Qt 编写了一个小的 JSON-RPC 实现。我使用了 Visual C++ 2013 编译器,它没有任何问题。
现在我将代码复制到带有 GCC 编译器的 Linux Mint 机器上,但总是收到以下错误:
jsonrpc.h:18: Error: conversion from 'long int' to 'QJsonValue' is ambiguous
static QJsonObject generateErrorObj(ErrorCode code, QString message, QJsonValue data = NULL);
此错误也出现在第 19 行(方法 generateErrorResponse)和第 20 行(方法 generateRequest)。所以......现在我对 C++ 或 Qt 不太熟悉,所以我不明白,为什么这不起作用,虽然它在 Windows 上工作......
这里是jsonrpc.h的完整代码:
#ifndef JSONRPC_H
#define JSONRPC_H
#include <QtCore>
class JSONRPC
{
public:
enum ErrorCode
{
PARSE_ERROR = -32700,
INVALID_REQUEST = -32600,
METHOD_NOT_FOUND = -32601,
INVALID_PARAMS = -32602,
INTERNAL_ERROR = -32603
};
static QJsonObject generateObj(QString id, bool isNotification = false);
static QJsonObject generateErrorObj(ErrorCode code, QString message, QJsonValue data = NULL);
static QJsonObject generateErrorResponse(QString id, ErrorCode code, QString message, QJsonValue data = NULL);
static QJsonObject generateRequest(QString id, QString method, QJsonValue parameters = NULL, bool isNotification = false);
static QJsonObject generateResponse(QString id, QJsonValue result);
};
#endif // JSONRPC_H
【问题讨论】:
-
QJsonValue的类型是什么?我猜这是一个代表另一种类型的 typedef。查找定义 QJsonValue 的位置(在 QtCore 包含中)。很可能,它在 Linux 和 Windows 上的定义不同。
-
这很可能发生,因为 QJsonValue 可以由两种在 Windows 上不同但在 Linux 上相同的类型构造而成。例如,如果 time_t 有一个重载,在 Windows 上将是 int64,这与 long int(在 Windows 上是 32 位)不同,而在 Linux 上,相同的 time_t 实际上可能是一个 long int,因此给你两个无法相互区分的重载。
-
我查了 QJsonValue。我错了,它不是typedef。既然是一门课,那就用 ddriver 的回答吧。这可能会奏效。