但是,如果实用工具类是从Qt类派生的,我会出现链接错误。我认为问题出在Q_OBJECT宏上,如果我不添加它,我就不会得到错误。但是在任何Qt派生类中都必须/建议使用Q_OBJECT宏。
我怎样才能避免这个ISUE?有没有其他方法来拥有一个具有文件作用域的实用程序类?
用于显示错误的简单示例:CMyClass类使用从QWidget派生的实用工具类(名为CUtility)。
class CMyClass
{
public:
CMyClass();
void someMethod();
};
#include <QtWidgets>
#include "CMyClass.h"
namespace
{
class CUtility : public QWidget
{
Q_OBJECT
public:
CUtility(QWidget *p_parent = 0) : QWidget(p_parent){qDebug() << "CUtility constructor";}
void utilityMethod() {qDebug() << "This is CUtility::utilityMethod()";}
};
}
CMyClass::CMyClass()
{
qDebug() << "CMyClass constructor.";
}
void CMyClass::someMethod()
{
qDebug() << "This is CMyClass::someMethod().";
CUtility p_myUtil;
p_myUtil.utilityMethod();
}
错误有:
LNK2001:未解析的外部符号“public:virtual struct QMetaObject const*__cdecl`匿名命名空间'::cutility::metaobject(void)const”(?metaobject@cutility@?a0x27a8253c@@uebapebuqmetaobject@@xz)
LNK2001:未解析的外部符号“public:virtual void*__cdecl`anonymous namespace”::cutility::qt_metacast(char const*)“(?qt_metacast@cutility@?a0x27a8253c@@ueaapeaxpebd@z)sin解析器
LNK2001:未解析的外部符号“public:virtual int__cdecl`anonymous namespace'::cutility::qt_metacall(enum qmetaobject::call,int,void**)”(?qt_metacall@cutility@?a0x27a8253c@@ueaahw4call@qmetaobject@@hpeapeax@z)sin解析器
这与匿名命名空间完全无关。事实上,他们是一个非sequitur。
回想一下,moc生成了一些方法的实现,包括信号和一些静态数据。要使其工作,类声明必须对moc输出可见。它在.cpp
文件的末尾可见。
因此,要在foo.cpp
文件中包含Q_Object
类,必须#在该文件末尾包含“foo.moc”
。如果使用cmake,只需重新构建,或者,对于qmake,首先重新运行qmake,然后构建项目。仅此而已。
// main.cpp
#include <QObject>
namespace {
class Utility : public QObject {
Q_OBJECT
public:
Utility(QObject *parent = {});
};
}
Utility::Utility(QObject *parent) : QObject(parent) {}
int main() {
Utility utility;
}
#include "main.moc"
VS 我习惯了第二种方法,但第一种方法是等价的吗?
我在xslt中需要这个,但是xmlns:s=“{$service-uri}”没有提取: 如何提取名称空间定义中的service-uri变量?扎梅克
本文向大家介绍thinkphp autoload 命名空间自定义 namespace,包括了thinkphp autoload 命名空间自定义 namespace的使用技巧和注意事项,需要的朋友参考一下 使用thinkPHP过程中,一些自定义的类库和第三方类库需要找一个合适的位置放置,放到系统默认的org文件夹感觉不太好,破坏了thinkPHP的原生目录。 就看了一下官方手册,可以在模块或者应用的
为什么using指令在包含在匿名命名空间中时表现得好像出现在全局范围?
构建MVC3解决方案进展顺利,但在浏览器中出现错误: 编译器错误消息:CS0234:命名空间“系统”中不存在类型或命名空间名称“Html”。网状物Mvc'(是否缺少部件引用?) 我已经用为解决方案安装了数据包,并为所有项目进行了设置。MVC3是否包含库System.网页。mvc.Ajax,等?为什么我得到了错误? 在References文件夹中,我有一个系统。网状物Mvc , 网状物配置 MSDN
关于术语的一点说明: 请务必注意一点,TypeScript 1.5里术语名已经发生了变化。 “内部模块”现在称做“命名空间”。 “外部模块”现在则简称为“模块”,这是为了与ECMAScript 2015里的术语保持一致,(也就是说 module X { 相当于现在推荐的写法 namespace X {)。 这篇文章描述了如何在TypeScript里使用命名空间(之前叫做“内部模块”)来组织你的代码