Ошибки, баги, вопросы - страница 1965

 

A100:

template <typename T>
int xxx::value = -1;

Вообще конечно данный способ не соответствует C++,  но в MQL работает.

У меня была аналогичная проблема с выносом метода за пределы класса:

template<typename T>
class A
{
 public:
  void f();
};

template<typename T>
void A<T>::f() { }  //'A' - identifier already used

Но благодаря вам теперь тоже решение найдено:

template<typename T>
void A::f() { }
хотя это тоже неправильно конечно, т.к. означает определение шаблонного метода, а не метода шаблонного класса.  И если в классе присутствует и то, и другое, то возникнет неоднозначность
 
Alexey Navoykov:

У меня была аналогичная проблема с выносом метода за пределы класса:

Так намного удобнее. Единственное ограничение - нельзя чтобы между вклинивался другой класс (как в примере)

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

A100, 2016.05.19 23:26

Ошибка компиляции

template<typename T>
class A { public:
        bool operator==( const A& ); //error: 'operator' - function must have a body
        T t;
};
class B {
        A<int> a;
};
template<typename T>
bool A::operator==( const A& )  { return false; }
void OnStart()
{
        A<int> a, b;
        Print( a == b );
}
Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2016.05.19
  • www.mql5.com
Форум алго-трейдеров MQL5
 
Alexey Navoykov:

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

Не возникнет - все продумано до нас (с). Нужно повторить строку template дважды (верхняя будет относится к классу, нижняя - к методу)
 
A100:
Не возникнет - все продумано до нас (с). Нужно повторить строку template дважды (верхняя будет относится к классу - нижняя к методу)

Блин это ж пипец как запутанно выглядит.    

A100:
Так намного удобнее.

Ну да, отсутствие необходимости ставить <T>  - это прям такое серьёзное удобство )

 
Alexey Navoykov:

Ну да, отсутствие необходимости ставить <T>  - это прям такое серьёзное удобство )

Я имел ввиду, что удобна сама возможность выносить метод за пределы класса
 
Alexey Navoykov:

У меня была аналогичная проблема с выносом метода за пределы класса:

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

Заметил, что часто методывыносят за пределы класса, а зачем? Посмотрел СБ, так там "мелкие" методы сразу в одну строку определены, "длинные" - за пределами. Удобства восприятия нет, т.к. ALT+G при внешнем определении предлагает не один, а два места перехода. А если есть перегрузки, то, соответственно, кратное двум. А по ALT+M итак все сразу видно.

Возможно, это какая-то дань наглядности задания интерфейса, но пока не проникся.

 
A100:
Я имел ввиду, что удобна сама возможность выносить метод за пределы класса

Ну да, вот так мучаешься-мучаешься, а потом выясняется что надо было знать определённые секреты )

Может у них и специализация шаблонных классов тоже есть?  какими-то хитроумными способами.  А то чё-то я давно в сервис-деске прошу об этом, а они молчат. Наверно тоже есть секреты.  Колитесь )

 
Alexey Navoykov:

Может у них и специализация шаблонных классов тоже есть?

Так давно как!

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2017.08.16 13:19

typedef void (*fn)();

template<typename T>
void g( T Value ) { Print(typename(Value)); }
void f() {}

void g( fn Value ) { Print(typename(Value)); }
void OnStart()
{
        g( f ); // void(*fn)()
}

Или что-то другое имеется в виду?


ЗЫ Нашел.

 
fxsaber:

Так давно как!

Или что-то другое имеется в виду?

ЗЫ Нашел.

Не, я говорил про шаблоны классов, а не функций.

К слову, специализация шаблонов функций на самом деле ещё не реализована.  То что по вашей ссылке они почему-то назвали "специализацией" на самом деле совсем другое.  А сейчас есть возможность только перегрузки с конкретными типами.  По сути это почти то же самое, что и специализация, с той лишь разницей, что отсутствует контроль компилятора за идентичностью сигнатуры всех перегруженных функций.  А это бывает необходимо, когда функции расположены в разных местах кода.

 
A100:

Так намного удобнее.

В случае отсутствия специализаций.