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 に答える