Скачать MetaTrader 5

Пример использования шаблонов функций в классе ?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
o_o
Модератор
23859
o_o  

не могу подружить template с функциями классов

class Obj {};

class List
{
public:
 template <typename T> void New() { Obj* obj=new T(); }
};

class Array
{
 List a;
 virtual void Add() { a.New<Obj>(); }
};

при обращении a.New<Obj> выдаёт ошибки

первая из которых  - pointer to this function type is not supported yet

а если оставить a.New, то выдаёт


template mismatch
cannot to apply function template

----

как победить?

есть у кого рабочий пример?

Andy Sanders
401
Andy Sanders  
Предположение, IDE под рукой нет

1) class Obj : public CObject
2) T * obj=new T();
o_o
Модератор
23859
o_o  

нет.   это не влияет.

ошибка лишь в строке virtual void Add() { a.New<Obj>(); }


лучше подождать знатоков.

Artyom Trishkin
Модератор
77539
Artyom Trishkin  
o_O:

нет.   это не влияет.

ошибка лишь в строке virtual void Add() { a.New<Obj>(); }


лучше подождать знатоков.

У Анатолия в его библиотеке используются шаблонные методы.
Комбинатор
16033
Комбинатор  

Тот самый случай, когда просимая и обещанная ... лет назад справка по ошибкам с примерами очень пригодилась бы.

Потому что нифига не понятно чего компилятор хочет. 

Как вариант не получается через функции пробуй через класс. 

o_o
Модератор
23859
o_o  
Artyom Trishkin:
У Анатолия в его библиотеке используются шаблонные методы.
а можно подробней? в статье упоминаний нет про шаблоны методов
Artyom Trishkin
Модератор
77539
Artyom Trishkin  
o_O:
а можно подробней? в статье упоминаний нет про шаблоны методов
В файле WndContainer.mqh его библиотеки присутствуют шаблонные методы, но наверное я читал вопрос по диагонали, и это совсем не то, о чём спрашивалось...
Alexey Navoykov
3996
Alexey Navoykov  
Дело в том, что разработчики до сих пор не реализовали полноценных шаблонов функций.  Сейчас все typename должны быть привязаны к аргументам функции, только так.  Поэтому придётся передавать фэйковый аргумент.
Надо бы надавить на разработчиков, чтоб доделали наконец шаблоны.
George Merts
3746
George Merts  

У меня темплейты неплохо работают - я сделал обертку для любых структур, чтобы их можно было легко использовать в стандартных CArrayObj (этот класс понимает только указатели на потомки от CObject).

В приведенном примере - правильно было указано, что объект должен наследоваться от CObject, плюс в функции Add() - по-моему, неверный синтаксис.

George Merts
3746
George Merts  

Мне кажется, что автор не вполне понимает саму суть шаблонов.

Как я понял, нужен массив списков из любых объектов.

Его код должен выглядеть так.

Внутри .MQH:

class Obj:public CObject
{
};

template <typename T>
class CMyList
{
protected:
   T* m_pObj;
  
public:
 void New() { m_pObj=new T; }
};

template <typename T>
class CMyArray
{
 CMyList<T> a;
 public:
 virtual void Add() { a.New(); }
};

А потом, внутри основного .MQ5 кода:

   CMyArray<Obj> maArr;
   maArr.Add();

Все компилируется и работает.

o_o
Модератор
23859
o_o  
George Merts:

Мне кажется, что автор не вполне понимает саму суть шаблонов.


а мне кажется, вы не вполне поняли суть вопроса.

вы предлагаете шаблонный класс, который мне не нужен (но который конечно работает не только у вас).

но мне нужен лишь шаблонный метод в обычном классе, метод, который может создавать объект требуемого типа.

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий