2016-02-29 370 views
3

几个星期前,我在我的Windows笔记本写了一个小JSON-RPC FPGA实现基于C++和Qt。我使用了Visual C++ 2013编译器,它没有任何问题。C++/QT - 可选参数默认为NULL

现在我复制我的代码的Linux Mint的机器与GCC编译器,我总是得到以下错误:

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的,所以我不明白,为什么这不起作用,althought它工作在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 
+0

什么是QJsonValue的类型?我猜它是代表另一种类型的typedef。查找QJsonValue的定义位置(在QtCore包含中)。最有可能的是,它在Linux和Windows上的定义不同。 –

+0

这很可能是因为QJsonValue可以从Windows上不同的两种类型构建而成,但在Linux上是相同的。例如,如果您有time_t的过载,这将是在Windows,这是从长整型(这是在Windows 32位)不同的Int64,而在Linux上相同的time_t实际上可能是一个长整型,从而给你两无法相互区分的重载。 –

+0

我抬头看看QJsonValue。我错了,它不是一个typedef。由于它是一个类,请与ddriver的答案一起去。这可能会起作用。 –

回答

5

NULL可能在两种平台上以不同方式实现。由于隐式转换有多个可能的候选者,因此“有问题”的实现会产生歧义。

而不是JsonValue parameters = NULL尝试JsonValue parameters = JsonValue() - 该构造函数将创建一个类型为null的json值。

此外,即使JsonValue parameters = NULL“作品”,它很可能是错的,因为这将是等于像JsonValue(int(0)),而不是一个“空”的JSON值作为JsonValue()其中有一个默认的QJsonValue::Type::Null参数。所以,你不会有一个NULL值JSON,但随着0值的数字JSON值 - 两个完全不同的事情

+0

QJsonValue更有可能以不同的方式实现。我对VS和GCC的经验表明NULL几乎总是被定义为零。 –

+0

@KyleA GCC中的'NULL'被定义为'__null',它似乎是虚构未知类型的指针。如果字符串化'NULL',你可以看到它:http://coliru.stacked-crooked.com/a/6562714b925829b9 –

+0

“JsonValue参数= JsonValue()”的明确的默认构造函数是不必要的。声明本身是正确的:'JsonValue参数;'。一般来说,Qt值类默认构造一个空值,所以这样的显式代码是不必要的,正如你所看到的,会导致错误。 –