Q_DECLARE_METATYPE一​​个boost :: multi_array的 [英] Q_DECLARE_METATYPE a boost::multi_array

查看:441
本文介绍了Q_DECLARE_METATYPE一​​个boost :: multi_array的的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图通过使用Qt的信号和槽机制重新psented作为的boost :: multi_array的$ P $多维数组。我试图用下面这段code来声明元型:

  Q_DECLARE_METATYPE(升压:: multi_array的<双,2  - ;)

不过,我得到以下编译错误(在2015年MSVC):

 路径\\为\\项目\\ metatypes.h(7):错误C2976:'的boost :: multi_array的':太少模板参数
.. \\ .. \\ ml_project \\升压库\\ \\包括升压/ multi_array.hpp(111):注:请参阅声明的boost :: multi_array的
路径\\为\\项目\\ metatypes.h(7):错误C2332:'枚举:缺少标签名
路径\\为\\项目\\ metatypes.h(7):错误C2065:定义:未声明的标识符
路径\\为\\项目\\ metatypes.h(7):错误C2143:语法错误:缺少'>'前;
路径\\为\\项目\\ metatypes.h(7):错误C2059:语法错误:'>'
路径\\为\\项目\\ metatypes.h(7):错误C2976:'QMetaTypeId':太少模板参数
c:\\qt\\qt-everywhere-opensource-src-5.5.0\\qtbase\\include\\qtcore\\../../src/corelib/kernel/qmetatype.h(1576):注:请参阅QMetaTypeId的声明
路径\\为\\项目\\ metatypes.h(7):错误C2913:明确的专业化; QMetaTypeId'不是一个类模板的特
.. \\ .. \\ ml_project \\升压库\\ \\包括升压/ multi_array.hpp(111):注:请参阅声明的boost :: multi_array的
.. \\ .. \\ ml_project \\升压库\\ \\包括升压/ multi_array.hpp(111):注:请参阅声明的boost :: multi_array的
路径\\为\\项目\\ metatypes.h(7):错误C2226:语法错误:意外的类型quintptr
路径\\为\\项目\\ metatypes.h(7):错误C2143:语法错误:缺少之前')'';'
路径\\为\\项目\\ metatypes.h(7):错误C2143:语法错误:缺少;前}


解决方案

之间的逗号双,2 解析作为宏定义的一部分。的解决方案如下:

选项#1

 的typedef的boost :: multi_array的<双,2  - ;我的名字;Q_DECLARE_METATYPE(MY_NAME);

选项2

 的#include<升压/实用/ identity_type.hpp>Q_DECLARE_METATYPE(BOOST_IDENTITY_TYPE((的boost :: multi_array的<双,2  - ;)));

选项#3

手写 BOOST_IDENTITY_TYPE

 模板< typename的T>结构identity_type;
模板< typename的T>结构identity_type<无效(T)> {typedef的T形; };#定义IDENTITY_TYPE(T)类型名identity_type<无效T> ::类型Q_DECLARE_METATYPE(IDENTITY_TYPE((的boost :: multi_array的<双,2 - ;)));

选项#4

由preprocessor宏替换逗号:

 的#define逗号,
Q_DECLARE_METATYPE(的boost :: multi_array的<两个逗号2 - );
和#undef逗号

I am trying to pass a multi-dimensional array represented as boost::multi_array using Qt's signals and slots mechanism. I attempted to declare meta-type using the following piece of code:

Q_DECLARE_METATYPE(boost::multi_array<double, 2>)

However I get the following compilation errors (on MSVC 2015):

path\to\project\metatypes.h(7): error C2976: 'boost::multi_array': too few template arguments
..\..\ml_project\boost-libs\include\boost/multi_array.hpp(111): note: see declaration of 'boost::multi_array'
path\to\project\metatypes.h(7): error C2332: 'enum': missing tag name
path\to\project\metatypes.h(7): error C2065: 'Defined': undeclared identifier
path\to\project\metatypes.h(7): error C2143: syntax error: missing '>' before ';'
path\to\project\metatypes.h(7): error C2059: syntax error: '>'
path\to\project\metatypes.h(7): error C2976: 'QMetaTypeId': too few template arguments
c:\qt\qt-everywhere-opensource-src-5.5.0\qtbase\include\qtcore\../../src/corelib/kernel/qmetatype.h(1576): note: see declaration of 'QMetaTypeId'
path\to\project\metatypes.h(7): error C2913: explicit specialization; 'QMetaTypeId' is not a specialization of a class template
..\..\ml_project\boost-libs\include\boost/multi_array.hpp(111): note: see declaration of 'boost::multi_array'
..\..\ml_project\boost-libs\include\boost/multi_array.hpp(111): note: see declaration of 'boost::multi_array'
path\to\project\metatypes.h(7): error C2226: syntax error: unexpected type 'quintptr'
path\to\project\metatypes.h(7): error C2143: syntax error: missing ')' before ';'
path\to\project\metatypes.h(7): error C2143: syntax error: missing ';' before '}'

解决方案

The comma between double, 2 is parsed as part of the macro definition. The solutions are as follows:

Option #1

typedef boost::multi_array<double, 2> my_name;

Q_DECLARE_METATYPE( my_name );

Option #2

#include <boost/utility/identity_type.hpp>

Q_DECLARE_METATYPE( BOOST_IDENTITY_TYPE( (boost::multi_array<double, 2>) ) );

Option #3

Hand-written BOOST_IDENTITY_TYPE:

template <typename T> struct identity_type;
template <typename T> struct identity_type<void(T)> { typedef T type; };

#define IDENTITY_TYPE(T) typename identity_type<void T>::type

Q_DECLARE_METATYPE( IDENTITY_TYPE( (boost::multi_array<double, 2>) ) );

Option #4

Replace a comma by a preprocessor macro:

#define COMMA ,
Q_DECLARE_METATYPE( boost::multi_array<double COMMA 2> );
#undef COMMA

这篇关于Q_DECLARE_METATYPE一​​个boost :: multi_array的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆