1

我想使用类似的东西

typedef double Matrix[4][4];

表示转换并使用 QT 信号/槽机制传递它们。但是当我使用

Q_DECLARE_METATYPE(Matrix)

它在这个函数的 qmetatype.h 中抛出一个错误

void *qMetaTypeConstructHelper(const T *t)
{
    if (!t)
        return new T();
    return new T(*static_cast<const T*>(t));
}

说:“错误C2075:'操作员new()的目标':数组初始化需要花括号”

4

2 回答 2

2

Q_DECLARE_METATYPE(T)要求类型T是默认可构造、可复制和可破坏的。您的Matrix类型不可复制,因此您不能Q_DECLARE_METATYPE在其上使用。

解决方法:使用一个类。

// copiable, C++98 brace-initializable, etc.
struct Matrix {
    double data[4][4];
};
于 2013-09-05T14:29:56.023 回答
1

理想情况下,您应该使用eigen3及其类型。或者,将您的类型包装在一个类中。一旦你这样做了,你还不如让这个类做更多的事情,而不仅仅是一个包装器。最终,您会发现 eigen3 是唯一合理的方法。可能当你到达这一点时:

#include <cstring>

class Matrix {
    double m_data[4][4];
public:
    typedef double (*Data)[4];
    Matrix() {}
    Matrix(const Matrix & other) { memcpy(m_data, other.m_data, sizeof m_data); }
    Matrix & operator=(const Matrix & other)  { memcpy(m_data, other.m_data, sizeof m_data); return *this; }
    Matrix & operator=(const Data other)  { memcpy(m_data, other, sizeof m_data); return *this; }
    operator Data() { return m_data; }
};

int main()
{
    double mat1[4][4];
    Matrix mat2;
    mat2[3][3] = 1;
    mat2 = mat1;
    return 0;
}
于 2013-09-05T14:38:51.990 回答