Russian Qt Forum

Программирование => С/C++ => Тема начата: altai от Октябрь 03, 2010, 14:45



Название: работа с шаблонным классом
Отправлено: altai от Октябрь 03, 2010, 14:45
Подскажите пожалуйста, где у меня ошибка или решение для следующей ситуции:
Hello, I've some problem with using templates:

myclass.h


Код:
#ifndef MYCLASS_H
#define MYCLASS_H

template <class S> class myclass
{

private:


public:
    myclass(void){};
    ~myclass(void){};
    void login(S login, S pass);
};



#endif // MYCLASS_H

myclass.cpp

Код:
#include "myclass.h"
#include "../additional_func.h" // для для функции connect(QString, QString)


template <class S>
void myclass::login(S login, S pass)
{

    additional_func->connect(login,pass);

}

в слоте на клик на форме:

Код:
myclass<QString> *vr = new myclass<QString>();
vr->login(ui->linelogin->text(),ui->linepwd->text());


получаю ошибку:

/home/user/test/mainwindow.cpp:30: error: undefined reference to `myclass<QString>::login(QString, QString)'
:: error: collect2: ld returned 1 exit status

Подскажите пожалуйста, в чем ошибка? правильно ли объявлен класс? Правильно ли создается его экземпляр? В общем, интересует вся критика и помощь в решении этой ошибки.


Название: Re: работа с шаблонным классом
Отправлено: Igors от Октябрь 03, 2010, 16:52
Подскажите пожалуйста, в чем ошибка? правильно ли объявлен класс? Правильно ли создается его экземпляр? В общем, интересует вся критика и помощь в решении этой ошибки.
"Тело" template ф-ции должно быть "в той же единице транслятора". Если Вы перенесете его из myclass.cpp в myclass.h, то линкер его найдет. Я обычно собираю тела template в еще одном h файле (напр. myclass_template.h) и в конце myclass.h пишу #include "myclass_template.h". А то myclass.h получается очень замусоренным (на мой вкус).

А также:

Код:
template <class S> class myclass
Трудновато читать в 1 строку, да и зачем избегать традиционного T? Приятнее так
Код
C++ (Qt)
template <class T>
class myclass
 

Код:
void login(S login, S pass);
Есть ли жгучая необходимость подавать по значению? Скромнее и лучше так
Код
C++ (Qt)
void login(const S & login, const S & pass);
 
Или по месту


Название: Re: работа с шаблонным классом
Отправлено: m_ax от Октябрь 03, 2010, 17:16
Цитировать
"Тело" template ф-ции должно быть "в той же единице транслятора". Если Вы перенесете его из myclass.cpp в myclass.h, то линкер его найдет. Я обычно собираю тела template в еще одном h файле (напр. myclass_template.h) и в конце myclass.h пишу #include "myclass_template.h". А то myclass.h получается очень замусоренным (на мой вкус).
Неправда)

ошибка здесь:
Код
C++ (Qt)
template <class S>
void myclass::login(S login, S pass)
{
 
   additional_func->connect(login,pass);
 
}
 

а надо так:
Код
C++ (Qt)
template <class S>
void myclass<S>::login(S login, S pass)
{
 
   additional_func->connect(login,pass);
 
}
 
Ну и конечно, лучше по константной ссылке передавать значения.


Название: Re: работа с шаблонным классом
Отправлено: altai от Октябрь 03, 2010, 17:30
Спасибо за ответы, думал это решается через пространство имен, буду разбираться.

Я обычно собираю тела template в еще одном h файле (напр. myclass_template.h) и в конце myclass.h пишу #include "myclass_template.h". А то myclass.h получается очень замусоренным (на мой вкус).
разве использование хеадера с прототипами функций не ускоряет работу компилятора?


Название: Re: работа с шаблонным классом
Отправлено: Igors от Октябрь 03, 2010, 18:15
разве использование хеадера с прототипами функций не ускоряет работу компилятора?
С темплейтами выбора нет - Вы не сможете позвать темплейт из cpp файла если тело находится в др. cpp файле (др. единице трансляции).

Неправда)
"Не вся правда" - просто Вы еще одну ошибку нашли  :)