Russian Qt Forum

Qt => Общие вопросы => Тема начата: jaroslav от Сентябрь 27, 2013, 16:45



Название: template
Отправлено: 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>&)


Подскажите, я не правильно что-то делаю или компилятор не может схавать?


Название: Re: template
Отправлено: mutineer от Сентябрь 27, 2013, 20:38
мне кажется у тебя проблемы с третьим параметром, с амперсандами ты перемудрил. Да и при вызове функции вроде как не надо типы параметров в угловых скобках указывать - компилятор сам извлечет типы из параметров


Название: Re: template
Отправлено: jaroslav от Сентябрь 28, 2013, 13:14
Ну не знаю, пробовал убрать &, и в угловые скобки перед функцией тоже убирал, все равно та же ошибка.


Название: Re: template
Отправлено: mutineer от Сентябрь 28, 2013, 13:15
Какого типа storage?


Название: Re: template
Отправлено: jaroslav от Сентябрь 28, 2013, 13:16
QVector<int>


Название: Re: template
Отправлено: mutineer от Сентябрь 28, 2013, 13:19
Судя по декларации твоей функции она хочет QVector<int>&
а записью &storage ты отдаешь ей QVector<int>*
по идее амперсанд перед storage не нужен


Название: Re: template
Отправлено: mutineer от Сентябрь 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 у тебя указатели


Название: Re: template
Отправлено: jaroslav от Сентябрь 28, 2013, 13:46
Да вроде же так и делаю. Блин, эрроры кидает. Чем компилишь?


Название: Re: template
Отправлено: mutineer от Сентябрь 28, 2013, 13:50
http://codepad.org другого сейчас под рукой нет.

Покажи как делаешь включая объявления переменных, которые передаешь как параметры


Название: Re: template
Отправлено: jaroslav от Сентябрь 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 указатели.


Название: Re: template
Отправлено: mutineer от Сентябрь 28, 2013, 13:59
Так а вот это я сразу не увидел. Я, конечно, могу ошибаться, но вроде бы нельзя внутри нешаблонного класса делать шаблонную функцию Похоже что ошибся и таки можно

Ну и так, в порядке размышления - я не могу придумать код, который был бы к месту внутри такой шаблонной функции. Тут точно нужен шаблон?


Название: Re: template
Отправлено: jaroslav от Сентябрь 28, 2013, 14:11
В принципе можно и обойтись без шаблона, но делается на перспективу. По поводу не шаблонных классов с шаблонными функциями не могу тоже сказать на 100%.
Окей, оставлю пока затею с шаблоном, а далее видно будет.

mutineer тебе большое спасибо за уделенное время.


Название: Re: template
Отправлено: mutineer от Сентябрь 28, 2013, 14:14
В принципе можно и обойтись без шаблона, но делается на перспективу. По поводу не шаблонных классов с шаблонными функциями не могу тоже сказать на 100%.

Я уже проверил и прочитал - можно.
А по поводу перспективы - какие операции можно провести с model и view, но при этом так, чтобы эти же операции можно было сделать с не наследниками от них?


Название: Re: template
Отправлено: m_ax от Сентябрь 28, 2013, 14:34
Реализация этой функции должна быть там же (в .h) где и её объявление. Скорее всего проблема в этом..


Название: Re: template
Отправлено: jaroslav от Сентябрь 28, 2013, 17:11
Цитировать
Я уже проверил и прочитал - можно.
Да, я тоже уточнил. Можно.

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

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

Вопрос решен, большое спасибо m_ax и mutineer.


Название: Re: template
Отправлено: Igors от Сентябрь 28, 2013, 17:29
Реализация этой функции должна быть там же (в .h) где и её объявление. Скорее всего проблема в этом..
m_ax, если нетрудно - сбацайте примерчик с такой конструкцией (аргумент с конструкцией template). Я читал что она возможна, но на этом мои познания здесь кончаются :) Спасибо


Название: Re: template
Отправлено: m_ax от Сентябрь 28, 2013, 18:35
Типичный пример (из книжки, как демонстрация):

Код
C++ (Qt)
template<class T, template<class U, class = std::allocator<U>> class Seq>
class Container {
   Seq<T> seq;
   typedef typename Seq<T>::iterator iterator;
public:
   void append(const T & t) { seq.push_back(t); }
   iterator begin() { return seq.begin(); }
   iterator end() { return seq.end(); }
};
 
int main()
{
   Container<int, std::vector> container;
   container.append(1);
   container.append(2);
 
   for (auto x : container) {
       std::cout << x << std::endl;
   }
   return 0;
}
 


Название: Re: template
Отправлено: Igors от Сентябрь 29, 2013, 05:49
Не понял, а где же "инстанциируется" тип U ?


Название: Re: template
Отправлено: Old от Сентябрь 29, 2013, 08:33
Не понял, а где же "инстанциируется" тип U ?
Здесь:
Код
C++ (Qt)
Seq<T>