【问题标题】:C++/Qt - Optional parameter default NULLC++/Qt - 可选参数默认 NULL
【发布时间】: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 的回答吧。这可能会奏效。

标签: c++ linux qt gcc


【解决方案1】:

NULL 可能在两个平台上以不同的方式实现。 “有问题”的实现会产生歧义,因为隐式转换的可能候选对象不止一个。

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

此外,即使JsonValue parameters = NULL“有效”,它也可能是错误的,因为它将等于JsonValue(int(0)),而不是JsonValue()中的“null”json值,它有一个默认的QJsonValue::Type::Null范围。所以你不会有一个 NULL json 值,而是一个值为 0 的 NUMBER json 值 - 两个完全不同的东西

【讨论】:

  • QJsonValue 的实现方式可能不同。我使用 VS 和 GCC 的经验表明,NULL 几乎总是被定义为零。
  • @KyleA NULL 在 GCC 中被定义为 __null,这似乎是一个虚构的未知类型的指针。如果对NULL进行字符串化,可以看到:coliru.stacked-crooked.com/a/6562714b925829b9
  • "JsonValue parameters = JsonValue()" 不需要显式的默认构造函数。声明本身就是正确的:JsonValue parameters;。一般来说,Qt 值类默认构造一个空值,所以这样的显式代码是不必要的,而且正如您所见,会导致错误。
  • @KubaOber - 这里的重点是要有一个默认参数值,这样你就可以在不指定的情况下调用函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 2011-04-15
相关资源
最近更新 更多