在类中初始化 QHash

Posted

技术标签:

【中文标题】在类中初始化 QHash【英文标题】:Initialize QHash inside a class 【发布时间】:2020-01-21 12:33:03 【问题描述】:

我想在一个类中初始化一个QHash<...>。没有问题,如果代码是在linux上用gcc编译的。但是如果我使用 MSVC12,我会收到以下错误:

C2661:QHash<...>::QHash:没有重载函数接受X参数

小例子:

testclass.h

#ifndef TESTCLASS_H
#define TESTCLASS_H

#include <QHash>
#include <QString>

class TestClass

public:
    TestClass();

    QHash<QString, QString> myHash = "Hi", "Hello",
                                      "test", "Test";
;

#endif // TESTCLASS_H

testclass.cpp

#include "testclass.h"

TestClass::TestClass()




main.cpp

#include <QCoreApplication>
#include <QDebug>

#include "testclass.h"

int main(int argc, char *argv[])

    QCoreApplication a(argc, argv);

    TestClass test;
    qDebug() << test.myHash;

    return a.exec();


untitled.pro

QT -= gui

CONFIG += c++11 console
CONFIG -= app_bundle

DEFINES += Q_COMPILER_INITIALIZER_LISTS

DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += main.cpp \
    testclass.cpp

HEADERS += \
    testclass.h

你们中有人知道为什么 MSVC 会抛出这个编译器错误以及如何避免这种错误吗?

【问题讨论】:

没有const 是否可以编译? 你确定你有相同的Qt版本和相似的编译器选项吗? 哦,这很有趣,它不是 const。如果我删除 const,错误是一样的。我的建议是,问题在于类内部的初始化。我将更改问题的标题。 @0xbaadf00d 是的,我敢肯定,我正在为 g++ 和 MSVC 使用相同的 Qt 版本。 Makefile 是从 .pro 文件中生成的。所以我很确定,编译器选项是相似的。 能否在Windows中使用Qt Creator尝试编译一下。 【参考方案1】:

试试这个代码;如果它不起作用,您的编译器不支持 C++11,或者您没有指定正确的编译器标志来启用它。

#include <vector>
#include <iostream>

const std::vector<int> numbers = 1, 2, 3;

int main()

    for(auto num: numbers)
    
        std::cout << num;
    

编译器标志可能是 -std=c++11 但我不确定 MSVC12

编辑

我无法访问 MSVC12,你可以试试这些吗?我认为它不完全支持 C++11

测试 1

#ifndef TESTCLASS_H
#define TESTCLASS_H

#include <QHash>
#include <QString>

QHash<QString, QString> const myHash = "Hi", "Hello",
                                        "test", "Test";

class TestClass

public:
    TestClass();
;

#endif // TESTCLASS_H

测试 2

#ifndef TESTCLASS_H
#define TESTCLASS_H

#include <vector>


class TestClass

public:
    TestClass();

    const std::vector<int> numbers = 1, 2, 3;
;

#endif // TESTCLASS_H

编辑

由于测试 1 有效而测试 2 无效,MSVC12 对 C++11 的支持确实有些奇怪。

C++11 声明你应该被允许在头文件中初始化你的类成员变量,但似乎 MSVC 不支持这一点。至少对于初始化列表。

在你最初的问题中,QHash 是 const,现在我不确定你想用这个实现什么,但我相当肯定你需要更多的 const 或者你可以将 QHash 作为 X 中的常量.cpp 文件。也许 QHash 中的字符串也应该是 const 的?

但这超出了这个问题的范围,也许可以考虑一下(?)

【讨论】:

我试过你的代码,它可以工作。我认为这意味着 MSVC 支持 C++11。我说的对吗? 是的,只剩下Qt版本了。 Qt 版本为 5.4.2。我知道那是旧的,但 g++ 和 MSVC 是一样的。 @0xbaadf00d 你死定了。至少在 msvc15 之前,对 c++11 的 mvsc 支持非常奇怪。 docs.microsoft.com/en-us/cpp/overview/… 测试 1:工作正常。当然,我需要将qDebug() &lt;&lt; test.myHash; 更改为qDebug() &lt;&lt; myHash; 但之后它就起作用了。

以上是关于在类中初始化 QHash的主要内容,如果未能解决你的问题,请参考以下文章

“只能在类中初始化静态常量整数变量”

在类中初始化向量

关于“只有静态常量整型数据成员才可以在类中初始化”

通过加入现有的 QHash 来初始化 const QHash

在类中初始化 const

C ++在类中初始化一个空列表