Инициализируйте QHa sh внутри класса - PullRequest
2 голосов
/ 21 января 2020

Я хочу инициализировать QHash<...> внутри класса. Нет проблем, если код скомпилирован с g cc на linux. Но если я использую MSVC12, я получаю следующую ошибку:

C2661 : QHa sh <...> :: QHa sh: никакая перегруженная функция не принимает 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

Кто-нибудь из вас знает, почему MSV C выдает ошибку компилятора и как ее избежать?

1 Ответ

1 голос
/ 21 января 2020

Попробуйте этот код; если он не работает, ваш компилятор не поддерживает 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

EDIT

У меня нет доступа к 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 утверждает, что вам следует разрешить инициализировать переменные-члены класса. в заголовочном файле, но кажется, что MSV C не поддерживает это. По крайней мере, для списков инициализаторов.

В вашем первоначальном вопросе QHa sh был постоянным, теперь я не уверен, чего вы хотели достичь с этим, но я вполне уверен, что вам либо нужно больше const или вы можете иметь QHa sh в качестве константы в имеющемся у вас файле X. cpp. Может быть, строки внутри QHa sh тоже должны быть константными?

Но это выходит за рамки этого вопроса, возможно, подумайте об этом (?)

...