Объявите неподписанный символ [] с помощью Q_DECLARE_METATYPE

Я пытаюсь настроить некоторые модульные тесты с QtTest, и я хотел бы использовать QFETCH.

Я тестирую следующую функцию:

static std::vector<bool> FrameHandler::getBitsFromFrame(unsigned char* data, unsigned char length);

Он просто конвертирует массив char в вектор битов.

Итак, я настроил свой тестовый класс следующим образом:

#include <QtTest/QtTest>
#include <vector>
#include "FrameHandler.h"
class BusTester : public QObject {
Q_OBJECT

private slots:

void bytesToVector_data() {
QTest::addColumn<unsigned char[]>("Tested");
QTest::addColumn<unsigned char>("Length");
QTest::addColumn< std::vector<bool> >("Reference");

// Test for one byte
std::vector<bool> oneByte(8, false);
oneByte[0] = true;
oneByte[1] = true;
oneByte[3] = true;
oneByte[4] = true;

unsigned char oneByteInput[1]{
0b11011000
};

QTest::newRow("One byte") << oneByteInput << 1 << oneByte;
}

void bytesToVector() {
QFETCH(unsigned char[], tested);
QFETCH(unsigned char, length);
QFETCH(std::vector<bool>, reference);

QCOMPARE(FrameHandler::getBitsFromFrame(tested, length), reference);
}
};

QTEST_MAIN(BusTester)
#include "bustester.moc"

Когда я делаю это, компилятор говорит:

expected unqualified-id before ‘[’ token
QFETCH(unsigned char[], tested);

А также :

On line `QTest::addColumn<unsigned char[]>("Tested");`, Type is not registered, please use the Q_DECLARE_METATYPE macro to make it known to Qt's meta-object system

Я думал, что две ошибки были связаны, поэтому я добавил Q_DECLARE_METATYPE(unsigned char[]); до объявления класса, но потом я получаю это:

В qmetatype.h, ожидаемый ‘>’ до ‘*’ токена (строка 1695)

Можно ли объявить unsigned char[] в систему Qt QMetaType?
Спасибо

1

Решение

Q_DECLARE_METATYPE (T) Тип T должен быть конструируемым, копируемым и разрушаемым.
Массив не соответствует этим правилам, но вы можете создать оболочку.

struct Arr
{
unsigned char arr[SIZE];
};
Q_DECLARE_METATYPE( Arr );

или же

typedef std::array<unsigned char, SIZE> TArr;
Q_DECLARE_METATYPE( TArr );

Но есть одна сложность — РАЗМЕР, Вы должны — это заявить

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]