![]() |
|
![]() ![]() ![]() |
|
SABROG |
|
||||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
У меня много однотипных параметров, но в принципе эти типы: QString, double, int, unsigned int, bool, unsigned char. Поэтому, чтобы не писать для каждого типа свою реализацию функции я решил воспользоваться шаблонами:
Соответственно получаю косяк:
(13 строка на форуме в секции кода, где юзается T) Как бы так исхитрится, чтобы заставить QVariant хавать то что он и будет хавать в принципе, но видимо его пугает, что вместо стандартных типов могут быть кастомы ? --- Всё, допетрил. Ключевой момент:
Это сообщение отредактировал(а) SABROG - 21.4.2008, 21:38 |
||||||
|
|||||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Нет, и все-таки есть проблема. Не удается преобразовать ни в какой тип данных:
Получаю: error: expected primary-expression before ';' token Я уж этот QVariant и через convert(QVariant::String) и через .value<QString>() пытался, ну никак не хочет. Теряется смысл шаблона, я думал компилятор должен закрывать глаза на это и подставлять только в том случае, когда идет непосредственный вызов функции из кода с нужными типами в параметрах. Это сообщение отредактировал(а) SABROG - 22.4.2008, 11:47 |
|||
|
||||
pilotnet |
|
|||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 22.4.2008 Репутация: нет Всего: нет |
Что-то я не допераю
вы везде пишите bool Dict::cTemplates::setParam(Tp::tParTypes parType, T) parent->pBase->bindValue(QLatin1String(":par"), qVariantFromValue(T)); "Т" - это ведь тип данных а не переменная этого типа это должно выглядеть как bool Dict::cTemplates::setParam(Tp::tParTypes parType,const T &value) а потом parent->pBase->bindValue(QLatin1String(":par"), qVariantFromValue(value)); или я не о том ? |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
О том, все правильно. Мой косяк, допетрил уже. Сейчас не могу другое понять, почему компилятор считает, что тип изначально передается как QString ?
--- Добавил еще пару функций с разными типами параметров, теперь характер ошибок изменился. Заподло, вот действительно было бы проще воспользоваться Copy->Paste и не заморачиваться насчет дублирующего кода. Это сообщение отредактировал(а) SABROG - 22.4.2008, 12:29 |
|||
|
||||
pilotnet |
|
|||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 22.4.2008 Репутация: нет Всего: нет |
потому что в темплейтах определение типа происходит на стадии компиляции
компилятор генерит код для каждого типа "T" |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Значит придется возвращаться к тому с чего я начал. Обидно 2 вечера и утро потратил на разбор характера ошибок. Воспользуюсь тогда void * и cast'ами. Это сообщение отредактировал(а) SABROG - 22.4.2008, 12:32 |
|||
|
||||
pilotnet |
|
|||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 22.4.2008 Репутация: нет Всего: нет |
чем не нравиться
|
|||
|
||||
SABROG |
|
||||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
класс сTemplates имеет все те же члены, что в базе данных, поэтому их надо синхронно изменять:
Например меняя имя (name), надо изменить и запись в БД
name это QString. Помимо имени есть еще параметры других типов, например ссылка на объект, которая может менятся, но в базе данных она принимает вид ключа с типом unsigned int.
--- Изначально идея была такая и видимо к ней придется вернутся:
Я бы не мог ЭТО назвать хорошим стилем программирования... Это сообщение отредактировал(а) SABROG - 22.4.2008, 12:57 |
||||||
|
|||||||
pilotnet |
|
|||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 22.4.2008 Репутация: нет Всего: нет |
дак тогда и передавай в эту функцию
уже (unsigned int)tour->inc все равно тебе что передовать надо разбираться самому в зависимости от типа |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Выбросил шаблон и сделал так:
|
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 2 Всего: 154 |
не знаю что такое QVariant, но мне кажется что boost::variant is more suitable
|
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
С бустом у меня что-то никак не склеивается, не хочет под mingw собирать. Я так понимаю это паттерн ?
Так сразу и не скажешь как он работает. |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 2 Всего: 154 |
boost::apply_visitor вызывает одну из перегруженных версий оператора () функтора helper, в зависимости от типа своего содержимого
если там строка, то вызовется void operator (QString & str) если int, то void operator (int) |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
А чем же это отличается от обычной перегрузки параметров ?
К тому же у меня параметры хоть и имеют разные типы, но эти типы могут быть общими для двух разных параметров. |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 2 Всего: 154 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |