Erros, bugs, perguntas - página 1570

 

Necessidade de refinar os modelos (tirar implementação fora da classe 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

Não posso implementar A::f3 fora da classe A {}.

Mas dentro da classe A {} pode. Sim, você pode... por exemplo, f2(), mas o inconveniente reside no propósito de assumir funções incómodas fora da classe A {}. O principal é que A::f1() pode ser trazido dentro da classe A {} e tudo funciona enquanto A::f3() não pode - o compilador gera um erro.

 
Não, isso é uma cabra, a propósito, um dactilógrafo é suposto resolver o problema
 
A100:

Necessidade de refinar os modelos (tirar implementação fora da classe A {})

Não posso implementar A::f3 fora da classe A {}.

Mas dentro da classe A {} pode. Sim, você pode... por exemplo, f2(), mas o inconveniente reside no propósito de assumir funções incómodas fora da classe A {}. O principal é que A::f1() pode ser trazido para fora da classe A {} e tudo funciona enquanto A::f3() não pode - o compilador gera um erro porque A::f1() e A::f3() principalmente não diferem em nada.

É assim que 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

E f1 e f3 são um pouco diferentes

 
Andrey Barinov:

É assim que se compila normalmente.

Não é - o compilador apenas assumiu que não há OnStart - não há problema.

adicionar

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

Erro de compilação: erro interno #9

Arquivos anexados:
Test114.mq5  3 kb
 

Se mudar um par de linhas, o erro muda para: tree optimization error

Mas originalmente (antes da simplificação) o erro era: erro de geração de código

E tudo acaba aí - mas antes de tudo funcionou bem.

Arquivos anexados:
Test115.mq5  3 kb
 
A100:

Fazer muitas fontes diferentes e finas num único arquivo. Para que os criadores pudessem utilizá-lo antes de lançarem outra construção de buggy.

Chamar ao arquivo "teste dos piolhos". Certamente, existem tais variantes de teste para diferentes tipos de compiladores.

 
Erro de compilação: erro de geração de código
Arquivos anexados:
Test116.mq5  2 kb
 


Ográfico de optimização pára de ser desenhado devido ao cálculo incorrecto do valor do critério. Por favor, fixe-o, pois é muito conveniente observar o processo de optimização no gráfico.

Aparece apenas nos critérios Balanço + máximo RF . // Pelo menos na minha prática (até agora pequena).

// Apenas quebras nos gráficos, a optimização é bem sucedida.

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

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

Eu estava errado.


 

Comportamento diferente de & e 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;
};