首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Q_DECLARE_METATYPE a boost::multi_array

Q_DECLARE_METATYPE a boost::multi_array
EN

Stack Overflow用户
提问于 2015-08-31 15:18:30
回答 1查看 515关注 0票数 5

我试图传递一个多维数组表示为boost::multi_array使用Qt的信号和插槽机制。我试图使用以下代码来声明元类型:

代码语言:javascript
复制
Q_DECLARE_METATYPE(boost::multi_array<double, 2>)

但是,我得到了以下编译错误(在MSVC 2015上):

代码语言:javascript
复制
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 '}'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-31 15:26:06

double, 2之间的逗号被解析为宏定义的一部分。解决办法如下:

备选案文1

代码语言:javascript
复制
typedef boost::multi_array<double, 2> my_name;

Q_DECLARE_METATYPE( my_name );

备选案文2

代码语言:javascript
复制
#include <boost/utility/identity_type.hpp>

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

备选案文3

手写BOOST_IDENTITY_TYPE

代码语言:javascript
复制
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>) ) );

备选案文4

用预处理宏替换逗号:

代码语言:javascript
复制
#define COMMA ,
Q_DECLARE_METATYPE( boost::multi_array<double COMMA 2> );
#undef COMMA
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32314575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档