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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: template  (Прочитано 7669 раз)
jaroslav
Гость
« : Сентябрь 27, 2013, 16:45 »

Привет. Ребята, подскажите по шаблонам.

Код:
    template <class T, class M, template <class> class S>
                          void [i]functionName[/i] (T *view, M *model, S<int> &storage);

Использование функции:

Код:
           [i]functionName[/i]<QTreeView, QStandardItemModel, QVector<int>& >
                                  (tree, model, &storage);

Ошибка:

no matching function for call to 'ClassName::functionName(QTreeView*&, QStandardItemModel*&, QVector<int>&)'
candidate is:

template<class T, class M, template<class> class S> static void functionName(T*, M*, S<int>&)


Подскажите, я не правильно что-то делаю или компилятор не может схавать?
« Последнее редактирование: Сентябрь 27, 2013, 16:48 от jaroslav » Записан
mutineer
Гость
« Ответ #1 : Сентябрь 27, 2013, 20:38 »

мне кажется у тебя проблемы с третьим параметром, с амперсандами ты перемудрил. Да и при вызове функции вроде как не надо типы параметров в угловых скобках указывать - компилятор сам извлечет типы из параметров
« Последнее редактирование: Сентябрь 28, 2013, 13:15 от mutineer » Записан
jaroslav
Гость
« Ответ #2 : Сентябрь 28, 2013, 13:14 »

Ну не знаю, пробовал убрать &, и в угловые скобки перед функцией тоже убирал, все равно та же ошибка.
Записан
mutineer
Гость
« Ответ #3 : Сентябрь 28, 2013, 13:15 »

Какого типа storage?
Записан
jaroslav
Гость
« Ответ #4 : Сентябрь 28, 2013, 13:16 »

QVector<int>
Записан
mutineer
Гость
« Ответ #5 : Сентябрь 28, 2013, 13:19 »

Судя по декларации твоей функции она хочет QVector<int>&
а записью &storage ты отдаешь ей QVector<int>*
по идее амперсанд перед storage не нужен
Записан
mutineer
Гость
« Ответ #6 : Сентябрь 28, 2013, 13:26 »

Код
C++ (Qt)
#include <iostream>
#include <vector>
 
template <template <class> class S> void foo(S<int> &param)
{
   std::cout << "Hello " << param;
}
 
int main()
{
   std::vector<int> vec;
   vec.push_back(3);
   vec.push_back(7);
   foo(vec);
   return 0;
}
 

Вот такой код точно работает, значит тебе надо так же сделать третий параметр.
Я надеюсь что tree и model у тебя указатели
Записан
jaroslav
Гость
« Ответ #7 : Сентябрь 28, 2013, 13:46 »

Да вроде же так и делаю. Блин, эрроры кидает. Чем компилишь?
Записан
mutineer
Гость
« Ответ #8 : Сентябрь 28, 2013, 13:50 »

http://codepad.org другого сейчас под рукой нет.

Покажи как делаешь включая объявления переменных, которые передаешь как параметры
Записан
jaroslav
Гость
« Ответ #9 : Сентябрь 28, 2013, 13:56 »

declare:

Код:
  template <class T, class Q, template <class> class W>
                        void func(T *view, Q *model, W<int> &storage);

implement:

Код:
template <class T, class Q, template <class> class W>
                      void classname::func(T *view, Q *model, W<int> &storage){
         //  to do
}

call:

Код:
    QVector<int> storage;
                 storage.append(1);
                 storage.append(2);
                 storage.append(3);
    func(tree, model, storage);

tree и model указатели.
Записан
mutineer
Гость
« Ответ #10 : Сентябрь 28, 2013, 13:59 »

Так а вот это я сразу не увидел. Я, конечно, могу ошибаться, но вроде бы нельзя внутри нешаблонного класса делать шаблонную функцию Похоже что ошибся и таки можно

Ну и так, в порядке размышления - я не могу придумать код, который был бы к месту внутри такой шаблонной функции. Тут точно нужен шаблон?
« Последнее редактирование: Сентябрь 28, 2013, 14:04 от mutineer » Записан
jaroslav
Гость
« Ответ #11 : Сентябрь 28, 2013, 14:11 »

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

mutineer тебе большое спасибо за уделенное время.
Записан
mutineer
Гость
« Ответ #12 : Сентябрь 28, 2013, 14:14 »

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

Я уже проверил и прочитал - можно.
А по поводу перспективы - какие операции можно провести с model и view, но при этом так, чтобы эти же операции можно было сделать с не наследниками от них?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #13 : Сентябрь 28, 2013, 14:34 »

Реализация этой функции должна быть там же (в .h) где и её объявление. Скорее всего проблема в этом..
Записан

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

Arch Linux Plasma 5
jaroslav
Гость
« Ответ #14 : Сентябрь 28, 2013, 17:11 »

Цитировать
Я уже проверил и прочитал - можно.
Да, я тоже уточнил. Можно.

Цитировать
Реализация этой функции должна быть там же (в .h) где и её объявление. Скорее всего проблема в этом.

m_ax спасибо. В этом была трабла.

Вопрос решен, большое спасибо m_ax и mutineer.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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