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

Alexey Navoykov:

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

Без примера не пойму.

fxsaber:

Без примера не пойму.

На самом деле я там преувеличил, сказав что "почти то же самое".  Отличия существенные, т.к. перегрузить можно только аргументы функции, а в шаблоне могут присутствовать и прочие typename, не относящиеся к аргументам. И их можно только специализировать.  Вот например шаблон без аргументов вообще:

template<typename T>
void f() { }

template<>
void f<int>() { }
Alexey Navoykov:
Специализация без аргументов? )) а по чем специализироваться будет?
Комбинатор:
Специализация без аргументов? )) а по чем специализироваться будет?
Ну это уж в теле функции решишь. А что здесь такого?  У меня очень часто возникает такая потребность.  Приходится выкручиваться через передачу фиктивного параметра, что очень костыльно.
Alexey Navoykov:
А что здесь такого?
Ничего, если получится это в плюсах скомпилить и запустить )

Сразу после обновления на build 1650, при перетаскивании из Навигатор\Избранное нескомпилированного эксперта Draw на график вместо записи MQL5    cannot open file 'Draw.ex5' -> запускается другой эксперт, а именно ExpertMACD

После завершения компиляции Draw все исправилось, но сам факт

Добавлю: Cитуация повторяющаяся - вместо любого нескомпилированного советника запускается ExpertMACD 

Комбинатор:
Ничего, если получится это в плюсах скомпилить и запустить )

Не очень понимаю, что вас здесь не устраивает.  Всё работает.

template<typename T>
void f() { }

template<>
void f<int>() { }

int _tmain(int argc, _TCHAR* argv[])
{
  f<double>();
  f<int>();

  return 0;
}
Alexey Navoykov:

Не очень понимаю, что вас здесь не устраивает.  Всё работает.

Ок, это я туплю.

Да, это я уже обнаружил. Но проблема в том (была), что в исходнике этот мембер - на самом деле массив, и я для простоты сперва решил разобраться со скаляром. Однако для массива аналогичный прием не катит. Пришлось массив втаскивать статиком внурь функции-члена.

Stanislav Korotky:

Однако для массива аналогичный прием не катит. Пришлось массив втаскивать статиком внурь функции-члена.

Это уже ошибка компилятора - нужно сообщить в Сервисдеск

template<typename T>
struct A {
        static int i[];
};
template<typename T>
int A::i[]; //error: '[' - unexpected token