Errores, fallos, preguntas - página 1570

 

Necesidad de refinar las plantillas (llevar la implementación fuera de la clase A {})

template<typename T>
class A { public:
template<typename T2>
        void f1( T2 t2 );
template<typename T2>
        void f2( T2 t2, T tt ) { Print( __FUNCSIG__, " ", typename( this.t ) ); }
template<typename T2>
        void f3( T2 t2, T tt );
        T t;
};
template<typename T>
template<typename T2>
void A::f1( T2 t2 )       { Print( __FUNCSIG__, " ", typename( this.t ) ); } //нормально
template<typename T>
template<typename T2>
void A::f3( T2 t2, T tt ) { Print( __FUNCSIG__, " ", typename( this.t ) ); } // error: 'T' - declaration without type

No puedo implementar A::f3 fuera de la clase A {}.

Pero dentro de la clase A {} se puede. Sí, puedes... por ejemplo, f2(), pero el inconveniente radica en el propósito de tomar funciones engorrosas fuera de la clase A {}. Lo principal es que A::f1() se puede meter dentro de la clase A {} y todo funciona mientras que A::f3() no puede - el compilador genera un error.

 
No, eso es una putada, por cierto un typedef se supone que resuelve el problema
 
A100:

Necesidad de refinar las plantillas (llevar la implementación fuera de la clase A {})

No puedo implementar A::f3 fuera de la clase A {}.

Pero dentro de la clase A {} se puede. Sí, puedes... por ejemplo, f2(), pero el inconveniente radica en el propósito de tomar funciones engorrosas fuera de la clase A {}. Lo principal es que A::f1() se puede llevar fuera de la clase A {} y todo funciona mientras que A::f3() no puede - el compilador genera un error porque A::f1() y A::f3() principalmente no difieren en nada.

Así es como se compila normalmente.

template<typename T>
class A { public:
template<typename T2>
        void f1( T2 t2 );
template<typename T2,typename T>
        void f2( T2 t2, T tt ) { Print( __FUNCSIG__, " ", typename( this.t ) ); }
template<typename T2,typename T>
        void f3( T2 t2, T tt );
        T t;
};
template<typename T2>
void A::f1( T2 t2 )       { Print( __FUNCSIG__, " ", typename( this.t ) ); } //?????????
template<typename T2,typename T>
void A::f3( T2 t2, T tt ) { Print( __FUNCSIG__, " ", typename( this.t ) ); } //error: 'T' - declaration without type

Y f1 y f3 son un poco diferentes

 
Andrey Barinov:

Así es como se compila normalmente.

No lo es - el compilador acaba de asumir que no hay OnStart - no hay problema.

añadir

void OnStart()
{
        A<long> a;
}
 

Error de compilación: error interno #9

Archivos adjuntos:
Test114.mq5  3 kb
 

Si cambias un par de líneas, el error cambia a: error de optimización del árbol

Pero originalmente (antes de la simplificación) el error era: error de generación de código

Y todo termina ahí - pero antes todo funcionaba bien.

Archivos adjuntos:
Test115.mq5  3 kb
 
A100:

Hacer un montón de diferentes fuentes delgadas en un archivo. Para que los desarrolladores puedan utilizarlo antes de que vayan a lanzar otra compilación con errores.

Llama al archivo "prueba de piojos". Seguramente, existen esas variantes de prueba para diferentes tipos de compiladores.

 
Error de compilación: error de generación de código
Archivos adjuntos:
Test116.mq5  2 kb
 


Elgráfico de optimización deja de dibujarse debido a un cálculo incorrecto del valor del criterio. Por favor, arréglelo, ya que es muy conveniente observar el proceso de optimización en el gráfico.

Aparece sólo en los criterios de Balance + max RF . // Al menos en mi (hasta ahora pequeña) consulta.

// Sólo se rompe el gráfico, la optimización es exitosa.

----------- UPD

Проявляется только на критерии Balance + max RF.

Me equivoqué.


 

Diferente comportamiento de & y GetPointer

class A {};
class B {
        A *f() const { return GetPointer( a ); } //не генерирует ошибки
        A *g() const { return &a; }              //ошибка: 'return' - cannot convert from const pointer to nonconst pointer
        A a;
};