这篇文章不仅仅是关于一般未解析的链接器符号;但是类中带有 Q_OBJECT 宏的可变参数函数。宏创建了很多由 moc 预编译器自动生成的组件。 由于我的代码中不明显的原因,它正在挖掘模糊的错误消息。 请注意,错误消息中没有出现我的源代码特有的符号。这种性质的问题调试起来特别棘手和神秘。 (它被错误地标记为关于一般未解析的外部符号的 ? 的欺骗。这不是我只是错过了在我的代码中定义某些过程的情况,而是引用了它。)
我正在尝试创建一个对象,它既有 Qt 事件,又有一个可以接受可变数量参数的函数。这是一个最小的示例,虽然缺少事件,但具有事件所需的 QObject 内容。问题是它会生成链接错误。它基于对此 SO 的第一个答案?:[C++ 中参数的可变数量?][1]
#include <iostream>
#include <string>
#include <initializer_list>
#include <qobject.h>
#include <qdebug.h>
class aClass : public QObject
{
Q_OBJECT
public:
template <typename T>
void func(T t)
{
qDebug() << t;
}
template<typename T, typename... Args>
void func(T t, Args... args) // recursive variadic function
{
qDebug() << t;
func(args...) ;
}
};
int main()
{
QString str1( "Hello" );
aClass a;
a.func(1, 2.5, 'a', str1);
}
我得到的错误是:
main.obj:-1: error: LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __cdecl aClass::metaObject(void)const " (?metaObject@aClass@@UEBAPEBUQMetaObject@@XZ)
main.obj:-1: error: LNK2001: unresolved external symbol "public: virtual void * __cdecl aClass::qt_metacast(char const *)" (?qt_metacast@aClass@@UEAAPEAXPEBD@Z)
main.obj:-1: error: LNK2001: unresolved external symbol "public: virtual int __cdecl aClass::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@aClass@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z)
如果我删除 QObject 的东西,它就可以工作。如果函数在类之外,它就可以工作。有没有办法让两者都在同一个班级?我想将三个预定类型的参数作为第一个参数,而不是相同类型的参数,然后是从零到任意数量的 QString 参数。这是针对 c++11 中的项目,但 c++17 的答案也是可以接受的。 [1]:https://stackoverflow.com/a/16338804/1378243