这是Qt论坛的重复帖子:Qt forum thread
我需要在Qt信号和插槽功能中传递fixed-size vectorizable Eigen types。 请注意,信号和相应的插槽功能在需要QueuedConnection的不同线程中运行。因此,复制了信号函数中传递的参数。有关详细信息,请参阅此link
Qt声明参数可以通过值或const引用传递,信号槽将根据连接类型(QueuedConnection / DirectConnection)决定是否需要复制。
然而,Eigen声明Eigen对象必须通过引用传递,否则它是非法的或程序可能崩溃(在我的情况下:我有对齐问题的编译错误)。有关详细信息,请参阅此处:link
如果我通过const引用传递Eigen对象并使用qRegisterMetaType()在信号槽的connect()之前注册了Eigen对象,我也得到了编译错误。错误看起来像: 带有__declspec(align('16'))的实际参数将不会对齐
我还根据需求here编写了一个包含Eigen对象的包装类。不幸的是,同样的错误。
我的环境:Win7 64bit - VS2010 - Qt 5.3.1 - Eigen 3.2.4
有没有人在Qt信号槽功能中传递Eigen对象作为参数?你是怎么做到的。
更新(添加SSCCE): 如果你想克隆自己,我已经把它放在了主旨上: https://gist.github.com/f8af655a238ec136dbe9.git
// main.cpp
#include <QCoreApplication>
#include "A.h"
#include "B.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
A obj_a;
B obj_b;
qRegisterMetaType<eigen_wrapper>("eigen_wrapper");
QObject::connect(&obj_a, &A::send, &obj_b, &B::receive);
return a.exec();
}
// A.h
#pragma once
#include <QObject>
#include "eigen_wrapper.h"
class A : public QObject
{
Q_OBJECT
private:
eigen_wrapper eigen_object;
signals:
// signal
void send(const eigen_wrapper &);
};
// B.h
#pragma once
#include <QObject>
#include "eigen_wrapper.h"
class B : public QObject
{
Q_OBJECT
private:
eigen_wrapper eigen_object;
public slots:
inline void receive (const eigen_wrapper &s)
{
eigen_object = s;
}
};
// eigen_wrapper.h
#pragma once
#include "Eigen/Dense"
class eigen_wrapper
{
Eigen::Vector3f vec;
Eigen::Quaternionf quat;
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
编译错误:
2&gt; ClCompile:2&gt; main.cpp中 2 - ; C:\ Qt的\ Qt5.3.1 \ 5.3 \ msvc2010_opengl \包括\ QtCore / qobjectdefs_impl.h(573): 错误C2718:&#39; const eigen_wrapper&#39;:实际参数with __declspec(对齐(&#39; 16&#39;))不会被对齐2&gt; C:\ Qt的\ Qt5.3.1 \ 5.3 \ msvc2010_opengl \包括\ QtCore / qobjectdefs_impl.h(588) :请参阅类模板实例化的引用 &#39; QtPrivate :: AreArgumentsCompatible&#39;正在编译2&gt;
用2> [2] A1 = eigen_wrapper,2&gt;
A2 = eigen_wrapper 2&gt; ] 2&gt;
c:\ qt \ qt5.3.1 \ 5.3 \ msvc2010_opengl \ include \ qtcore \ qobject.h(228):见 对类模板实例化的引用 &#39; QtPrivate :: CheckCompatibleArguments&#39;正在编译2&gt;
用2> [2] List1 = QtPrivate :: List,2&gt; List2 = QtPrivate :: List 2&gt; ] 2&gt; .. \ main.cpp(14):看 引用函数模板实例化&#39; QMetaObject :: Connection QObject :: connect(const A. *,Func1,const B ,Func2,Qt :: ConnectionType)&#39;正在编译2&gt;用2> [2] Func1 = void(__thiscall A :: )(const eigen_wrapper&amp;),2&gt; Func2 = void(__ thishisall B :: *)(const eigen_wrapper&amp;)2&gt; ] 2&gt; 2&gt; Build FAILED。
非常感谢, 林
答案 0 :(得分:0)
根据错误讨论持续了几年: http://eigen.tuxfamily.org/bz/show_bug.cgi?id=83
他们在以下环境中测试了Eigen: - MSVC9,MSVC10,MSVC11,x64 - >作品(错误不会显示) - MSVC11 x32 - &gt;作品。 - MSVC9,MSVC10,x32 - >失败。
作为一种解决方法,我把
#define EIGEN_DONT_ALIGN_STATICALLY
在任何包括Eigen标题之前。
现在代码编译并正常运行。