Russian Qt Forum
Октябрь 05, 2024, 02:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: работа с шаблонным классом  (Прочитано 2642 раз)
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

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

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Октябрь 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);
 
Или по месту
« Последнее редактирование: Октябрь 03, 2010, 16:56 от Igors » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #2 : Октябрь 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);
 
}
 
Ну и конечно, лучше по константной ссылке передавать значения.
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
altai
Гость
« Ответ #3 : Октябрь 03, 2010, 17:30 »

Спасибо за ответы, думал это решается через пространство имен, буду разбираться.

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

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Октябрь 03, 2010, 18:15 »

разве использование хеадера с прототипами функций не ускоряет работу компилятора?
С темплейтами выбора нет - Вы не сможете позвать темплейт из cpp файла если тело находится в др. cpp файле (др. единице трансляции).

Неправда)
"Не вся правда" - просто Вы еще одну ошибку нашли  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.163 секунд. Запросов: 23.