Шаблоны в с ++ - PullRequest
       17

Шаблоны в с ++

0 голосов
/ 02 октября 2010

У меня возникли проблемы с использованием шаблонов:

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 в других классах?

Ответы [ 3 ]

2 голосов
/ 02 октября 2010

Вы объявили login() в myclass в своем заголовке, но вы не показываете здесь, что вы определили его где-либо.

Поставив точку с запятой послесигнатура функции просто объявляет, что эта функция существует.Это не создает функцию.Вы должны определить функцию, чтобы использовать ее.

Вы можете определить ее в своем заголовке, поместив тело функции в {} вместо точки с запятой.

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
}

Поскольку это шаблонная функция, которая (предположительно) будет совместно использоваться несколькими файлами кода, она имеетбыть определенным в заголовке.

Без одного из них нет никакого тела функции, определенного для компилятора, который будет выполняться при вызове этой функции, следовательно, ошибка «неопределенная ссылка».

1 голос
/ 02 октября 2010

Вы должны поместить реализацию вашей функции шаблона в файл заголовка, а не в файл .cpp.

Определение шаблона должно быть доступно компилятору, когда его нужно создать. В точке, где вы вызываете vr->login(...), компилятору необходимо иметь определение шаблона (тело функции) для создания экземпляра login<QString>(). Если тело функции шаблона «спрятано» в каком-то файле .cpp, то никакая функция не создается, и позже компоновщик жалуется, что она отсутствует.

0 голосов
/ 02 октября 2010

В файле .cpp метод называется start (), а не login ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...