Передача параметров шаблона - PullRequest
0 голосов
/ 13 августа 2010

Я пытаюсь лучше понять шаблоны

У меня есть шаблонный класс, который начинается так в моем .h:

template <class DOC_POLICY, class PRINT_POLICY, class UNDO_POLICY>
class CP_EXPORT CP_Application : public CP_Application_Imp

Теперь мне нужно инициализировать так в моем .cpp, поэтому я делаю:

CPLAT::CP_DocumentPolicy_None * d = new CPLAT::CP_DocumentPolicy_None();
CPLAT::CP_PrintPolicy_None * p = new CPLAT::CP_PrintPolicy_None();
CPLAT::CP_UndoPolicy_None * u = new CPLAT::CP_UndoPolicy_None();

CPLAT::CP_Application::Init(d, p, u);

Я получаю сообщение об ошибке CPLAT :: CP_Application :: Init (d, p, u); что говорится:

ошибка: «шаблонный класс CPLAT :: CP_Application» используется без параметров шаблона

Как передать параметры шаблона?

Ответы [ 2 ]

0 голосов
/ 13 августа 2010
  1. У вас есть шаблон класса , а не "шаблон класса". Это шаблон, из которого можно генерировать классы. (Также есть шаблоны функций . Это шаблоны, из которых генерируются функции.)

  2. Требуется Тип параметров . d, p и u являются (указателями) объектами, а не типами. Типы, например, CPLAT::CP_DocumentPolicy_None, CPLAT::CP_PrintPolicy_None и CPLAT::CP_UndoPolicy_None.
    Таким образом, вы должны быть в состоянии сделать

    CP_Application< CPLAT::CP_DocumentPolicy_None
                  , CPLAT::CP_PrintPolicy_None
                  , CPLAT::CP_UndoPolicy_None > app;
    
  3. Если у вас есть шаблоны функций, где параметры шаблона также параметры функции (они отображаются как типы в списке аргументов функции), вы можете опустить их в списке фактических аргументов шаблона при создании экземпляра шаблона:

    template< typename T >
    void f(T obj) {...}
    ...
    f(42); // same as f<int>(42), because 42 is of type int
    

    Это автоматический вывод аргумента функции.

  4. Вместо того, чтобы вызывать функцию-член Init, пусть конструктор инициализирует объект.

0 голосов
/ 13 августа 2010

Я считаю, что это должно работать

CPLAT::CP_Application<CPLAT::CP_DocumentPolicy_None,CPLAT::CP_PrintPolicy_None,CPLAT::CP_UndoPolicy_None>::Init(d,p,u);
...