Новая версия платформы MetaTrader 5 build 3550: улучшения и исправления - страница 22

 
Stanislav Korotky #:

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

Вызов f<int> - однозначно, шаблон.

Вызов f в себе не содержит никакого намека на шаблон. Можно подумать, что f == f<void>, но и такого нет.

 
fxsaber #:

Вызов f в себе не содержит никакого намека на шаблон. Можно подумать, что f == f<void>, но и такого нет.

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

 
Stanislav Korotky #:

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

Нужной шаблонной сигнатуры не находит (доказательство) - надо искать среди остальных. Этого не происходит. Другие языки с таким же поведением?

 
fxsaber # :

Нужной шаблонной сигнатуры не находит ( доказательство ) - надо искать среди остальных. Этого не происходит. Другие языки с таким же поведением?

Нет, он отлично компилируется и работает с C++ (без использования NULL, который отличается от C++).
 
Alain Verleyen #:
Нет, он отлично компилируется и работает с C++ (без использования NULL, который отличается от C++).

Спасибо!

 
Alain Verleyen #:
Нет, он отлично компилируется и работает с C++ (без использования NULL, который отличается от C++).

Не все фичи C++ реализованы. Некоторые реализованы с ошибкой.

Но в данном случае, с высоты 30-летнего опыта программирования на C++, я бы сказал: "не надо так делать". Это - путь к трудноуловимым ошибкам.

Больше скажу. Одинаковые имена методов разных (но похожих классов) (особенно в больших проектах) затрудняют поиск вызовов этих методов по проекту

 
Slava #:

Одинаковые имена методов разных (но похожих классов) (особенно в больших проектах) затрудняют поиск вызовов этих методов по проекту

Как практикуете наименования тогда?

 
Denis Kirichenko #:

Если код из примера представить как скрипт:

То после компиляции имеем:


Другие примеры из раздела "Преобразования матриц" компилируются нормально.

Если конечно пример подразумевает своё воспроизведение. Если нет, то вопрос снимается...

Вот рабочий пример

#property script_show_inputs
//--- input parameters
input int  InpSize1   =512;
input int  InpSize2   =256;
input int  InpSize3   =1024;
//+------------------------------------------------------------------+
//| Заполнение тестовой невырожденной матрицы                        |
//+------------------------------------------------------------------+
template<typename T>
void MatrixFill(matrix<T> &matrix_a)
 {
  ulong size_m=matrix_a.Rows();
  ulong size_k=matrix_a.Cols();
  T     value=0.0;
//--- заполним матрицу
  for(ulong i=0; i<size_m; i++)
   {
    for(ulong j=0; j<size_k; j++)
     {
      if(i==j)
        matrix_a[i][j]=T(1.0+i);
      else
       {
        value+=1.0;
        matrix_a[i][j]=value;
       }
     }
   }
 }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
int OnStart()
 {
  int errors=0;

  errors+=TestEigen<double>(InpSize1);
  errors+=TestEigen<double>(InpSize2);
  errors+=TestEigen<double>(InpSize3);

  errors+=TestEigen<float>(InpSize1);
  errors+=TestEigen<float>(InpSize2);
  errors+=TestEigen<float>(InpSize3);
//---
  Print("Test ", errors?"failed":"passed");
  return(errors);
 }

/*
Результат

Eigen solver of double matrix 512 x 512  passed  vectors=489  time=4268.506 ms
Eigen solver of double matrix 256 x 256  passed  vectors=251  time=417.610 ms
Eigen solver of double matrix 1024 x 1024  passed  vectors=916  time=43708.280 ms
Eigen solver of float matrix 512 x 512  passed  vectors=1  time=2508.357 ms
Eigen solver of float matrix 256 x 256  passed  vectors=1  time=188.859 ms
Eigen solver of float matrix 1024 x 1024  passed  vectors=1  time=27209.666 ms
Test passed
*/

//+------------------------------------------------------------------+
//|  Тестирование метода Eig                                         |
//+------------------------------------------------------------------+
template<typename T>
int TestEigen(const int size_m)
 {
  int vectors=0;
  matrix<T> matrix_a(size_m, size_m);
  matrix<T> matrix_v(size_m, size_m);
  vector<T> vector_e(size_m);
//--- заполним квадратную матрицу
  MatrixFill(matrix_a);
//--- будем мерить микросекунды
  ulong t1=GetMicrosecondCount();
//--- Eigen Solver
  matrix_a.Eig(matrix_v, vector_e);
//--- замерим
  ulong t2=GetMicrosecondCount();
//--- проверим правильность A * v = lambda * v
  for(ulong n=0; n<vector_e.Size(); n++)
   {
    vector<T> eigen_vector=matrix_v.Col(n);
    vector<T> vector_c1   =eigen_vector*vector_e[n];
    vector<T> vector_c2   =matrix_a.MatMul(eigen_vector);

    //--- слишком много делений, потому ослабим проверку на точность до 10-го знака
    ulong errors=vector_c1.CompareByDigits(vector_c2, sizeof(T)==sizeof(double) ? 10 : 5);
    if(int(errors)<size_m/10)
      vectors++;
   }
  double elapsed_time=double(t2-t1)/1000.0;
  printf("Eigen solver of %s matrix %d x %d  %s  vectors=%d  time=%.3f ms",
         typename(T), size_m, size_m, vectors>0?"passed":"failed", vectors, elapsed_time);
  return(vectors==0);
 }
 
fxsaber #:

Как практикуете наименования тогда?

Имя класса + имя метода. Например, TerminalShutdown, TesterShutdown, SymbolShutdown etc

В одном и том же классе не должно быть одинаковых имён методов. Пусть даже и разные типы входных параметров. Например, ObjectInitFromFile и ObjectInitFromArray

 
Slava #:

Имя класса + имя метода. Например, TerminalShutdown, TesterShutdown, SymbolShutdown etc

Правильно понял?

class Terminal
{
  void TerminalShutdown() {}
};

class Tester
{
  void TesterShutdown() {}
};
Причина обращения: