[英]Templates in c++
我在使用模板时遇到一些问题:
myclass.h
#ifndef MYCLASS_H
#define MYCLASS_H
class myclass
{
private:
public:
~myclass();
myclass();
template<class S>
void login(S login, S pass);
};
#endif // MYCLASS_H
myclass.cpp
#include "myclass.h"
#include "../additional_func.h" // for connect(QString,QString) function
myclass::myclass()
{
}
template <typename S>
void myclass::login(S login, S pass)
{
additional_func->connect(login,pass);
}
myclass::~myclass()
{
}
在mainwindow.cpp中(我正在使用QT)
myclass *vr = new vr();
vr->login(ui->linelogin->text(),ui->linepwd->text()); // QString, QString
我得到错误:
mainwindow.cpp:31:错误:对`void ecore :: connect(QString,QString)'的未定义引用
在其他类中使用myclass :: connect的方法是什么?
您已经在标题的myclass
中声明了login()
,但是这里没有向我们显示您已在任何地方定义了它。
在函数签名之后加上分号只是声明该函数存在。 它不会创建函数。 您必须定义函数才能使用它。
您可以在标头中定义它,方法是将函数体放在{}
而不要使用分号。
class myclass{
// ...
template<class S>
void login(S login, S pass){
// code goes here
}
}
在此处放置定义是一种向编译器指示您希望内联函数的方法,尽管编译器可能会选择不这样做。
或者,您可以在.cpp文件中定义它,就像定义的其他函数一样。
template<class S> void myclass::login(S login, S pass){ // code goes here }
因为这是一个模板函数,(可能)将由多个代码文件共享,所以必须在标头中定义它。
如果没有其中之一,则在您调用此函数时,没有为编译器定义要执行的函数体,因此会出现“未定义的引用”错误。
您应该将模板功能的实现放在头文件中,而不要放在.cpp文件中。
模板的定义应在实例化时可供编译器使用。 在调用vr->login(...)
,编译器需要具有可用于创建实例login<QString>()
的模板定义(函数主体login<QString>()
。 如果模板函数的主体在某些.cpp文件中“隐藏”,则不会创建任何函数,随后链接器会抱怨缺少该函数。
在.cpp文件中,该方法名为start(),而不是login()。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.