Errores, fallos, preguntas - página 1965

 
fxsaber:

¡Exactamente! Ahora puedo llamar a f todo tipo de funciones y variables a la vez. Debe haber algo de sentido común en estas ambigüedades, para no provocar errores accidentales. En mi opinión, es lógico embaucar emitiendo una cadena vacía a typename f, en lugar de causar problemas cuando accidentalmente se coge y define otra f.

No te obstines en buscar el sentido común en todas partes, especialmente entre los bichos. Si te escuchas, cualquier error en MQL no es un error en absoluto, sino una característica que ha sido incluida por los sabios desarrolladores ))

Como ya se ha apuntado, si tienes alguna duda, lo primero es comprobarlo en C++, y luego dar una solución.

En cuanto a las ambigüedades, deberían causar un error del compilador y no dar problemas. Todo estaba claro y sin ambigüedades en la muestra A100, así que no entiendo muy bien a qué te refieres. Si necesitas sobrecargar una función, la sobrecargas y arreglas los errores de compilación en las ambigüedades y ya está.

 

¿Cómo puedo inicializar un miembro estático de una clase de plantilla en MQL?

template<typename T>
class xxx
{
  static int value;
};

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

¿Cómo puedo inicializar un miembro estático de una clase de plantilla en MQL?

Si se trata de un problema sencillo, llévalo a una clase base que no sea plantilla y herédala. En general, no sé cómo.
 
Stanislav Korotky:

¿Cómo puedo inicializar un miembro estático de una clase de plantilla en MQL?

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

A100:

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

En general, por supuesto, este método no corresponde a C++, pero funciona en MQL.

Tuve un problema similar con el método fuera de la clase:

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

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

Gracias a vosotros se ha encontrado la solución:

template<typename T>
void A::f() { }
Aunque esto también es erróneo, por supuesto, porque significa definir un método de plantilla, no un método de una clase de plantilla. Y si una clase contiene ambos, habrá ambigüedad
 
Alexey Navoykov:

Tuve un problema similar al tomar un método fuera de la clase:

Esto es mucho más conveniente. La única restricción es que no puedes tener otra clase (como en el ejemplo) entre

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Errores, fallos, preguntas

A100, 2016.05.19 23:26

Error de compilación

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:

porque significa definir un método de plantilla en lugar de un método de clase de plantilla. Y si la clase contiene ambos, habrá ambigüedad

No habrá ambigüedad: todo está pensado de antemano (c). Tenemos que repetir la línea de la plantilla dos veces (la superior se referirá a una clase, la inferior a un método)
 
A100:
No lo hará, todo está pensado antes que nosotros (c). Tienes que repetir la línea de la plantilla dos veces (la de arriba se referirá a la clase - la de abajo al método)

Tío, esto parece un auténtico desastre.

A100:
Es mucho más cómodo así.

Sí, bueno, no tener que poner <T> es una gran comodidad).

 
Alexey Navoykov:

Sí, no tener que poner una <T> es una gran comodidad).

Me refería a que es conveniente poder poner un método fuera de una clase
 
Alexey Navoykov:

Tuve un problema similar al tomar un método fuera de la clase:

erróneo, por supuesto, ya que significa definir un método de la plantilla en lugar de un método de la clase de la plantilla. Y si la clase contiene ambos, habrá ambigüedad.

Me he dado cuenta de que los métodos suelen colocarse fuera de la clase, pero ¿por qué? Miré a través de la SB, por lo que los métodos "pequeños" se definen en una línea a la vez, los métodos "largos" se definen fuera de la clase. No hay comodidad de percepción, porque ALT+G en la definición externa ofrece no uno, sino dos puntos de transición. Y si hay sobrecargas, entonces un múltiplo de dos, respectivamente. Y ALT+M ya muestra todo a la vez.

Tal vez sea una especie de tributo a la claridad de la definición de la interfaz, pero hasta ahora no me he metido en ella.