繁体   English   中英

C ++中的模板

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM