2016-02-29 373 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值類默認構造一個空值,所以這樣的顯式代碼是不必要的,正如你所看到的,會導致錯誤。 –