Qt 5.7.1 / GCC 6.3.0:错误:constexpr函数的主体'静态constexpr int QMetaTypeId2 <T>

问题描述

这段代码

namespace Config {
  class Value {
  public:
    enum Type {
      Null,Integer,String,Map,List,Boolean
    };

    Value();
    Value(int v);
    Value(const QString &v);
    Value(const QMap<QString,Value> &v);
    Value(const QList<Value> &v);
    Value(bool v);

    template<class T> T get() const {
      return value.value<T>();
    }

    enum Type type() const;
    enum Type listType() const;
    bool isNull() const;

    void setListType(enum Type t);

    operator QString() const;
    QString toString() const;

  private:
    QVariant value;
    enum Type value_type;
    enum Type list_elements_type;
  };
}

Q_DECLARE_MetaTYPE(Config::Value)

https://github.com/olegantonyan/mpz/blob/master/app/config/value.h) 在最新版本的gcc / qt上编译,但在Debian Stretch(gcc 6.3.0,qt 5.7.1)上失败

../../../../include/x86_64-linux-gnu/qt5/QtCore/qglobal.h:746:47: error: static assertion Failed: Type is not registered,please use the Q_DECLARE_MetaTYPE macro to make it kNown to Qt's Meta-object system

../../../../include/x86_64-linux-gnu/qt5/QtCore/qMetatype.h:1604:100: error: body of constexpr function 'static constexpr int QMetaTypeId2<T>::qt_Metatype_id() [with T = std::nullptr_t]' not a return-statement

完整版本日志https://build.opensuse.org/package/live_build_log/home:oleg_antonyan/mpz/Debian_9.0/x86_64

在CentOS7(gcc 4.8.5,qt 5.6.1)上也可以正常工作。尚未在较旧的版本上进行测试。

任何想法在这里有什么问题吗?

解决方法

发现问题: value.setValue(nullptr);在构造函数中,其中值是QVariant。

删除了这一行,现在可以编译了。不确定为什么我要放在第一位