Erros, bugs, perguntas - página 2271
![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Um erro de compilação:
Qual é a diferença fundamental entre (1)(2) e (3)(4)?
Se declarar classes (3)(4) fora das funções - não ocorre qualquer erro. Se declarar dentro de uma função, ocorrem erros.
A que pode estar relacionado o seguinte comportamento
compilar o indicador funciona correctamente, compilar novamente o indicador não funciona correctamente. Funciona correctamente no testador?
Que indicador?
O que é que o C++ produz aqui?
Para que funcione em MQL5, é necessário ter duas cordas diferentes na saída, não a mesma. Mas então o mecanismo de formação da assinatura deve ser absolutamente diferente. Se C++ der o mesmo resultado na impressão, o custo __FUNCSIG__ baixará drasticamente.
Resultado: C+++
void f<g1::A>( g1::A& )
void f<g2::A>( g2::A& )
Como pode ver, as cordas são diferentes. a assinatura da função é utilizada
Resultado: C+++
void f<g1::A>( g1::A& )
void f<g2::A>( g2::A& )
Como pode ver, as cordas são diferentes. a assinatura da função é utilizada
A MQL5 dá
void f<A>(A&)
Ou seja, não há nenhuma assinatura de classe dentro da função. Um dia, será apoiado.
E se a classe for global, que linha é que o C++ gera?
vazio f<::A>( ::A& )
vazio f<A>( A& )
A MQL5 dá
Ou seja, não há nenhuma assinatura de classe dentro da função. Um dia, será apoiado.
Se os compiladores C++ obsoletos não o suportarem, eles já dão um erro na primeira linha (1) do código fonte. É por isso que a questão foi colocada desta forma em primeiro lugar: porque é que existe um erro num caso e um erro normal num outro?
Esperávamos o mesmo comportamento em ambos os casos: ou um erro ou nenhum erro. E o erro não está na falta de apoio em si, mas no comportamento desigual em condições de igualdade (como neste exemplo)
E se a classe for global, que linha produz C++?
vazio f<::A>( ::A& )
vazio f<A>( A& )
A segunda variante
Se os compiladores C++ obsoletos não suportarem isto, eles já dão um erro na primeira linha (1) no código fonte. É por isso que a questão foi colocada desta forma em primeiro lugar: porque é que existe um erro num caso e um erro normal num outro?
Esperávamos o mesmo comportamento em ambos os casos: ou um erro ou nenhum erro. E o erro não está na falta de apoio em si mesmo, mas no comportamento desigual, sendo tudo o resto igual (como neste exemplo)
Bem, é fácil de explicar. O compilador vai de cima para baixo através do código formando as assinaturas correspondentes à medida que vai avançando. A primeira assinatura é criada sem qualquer problema. Chega-se à segunda e já existe uma tal assinatura. Aqui temos um erro na segunda linha.
Se declarar classes (3)(4) fora das funções, não ocorrem erros. Se declarar dentro de uma função, ocorrem erros.
substituir por
Se declarar dentro de uma função, também não ocorrem erros... qual é a diferença fundamental?
Portanto, é compreensível. O compilador vai de cima para baixo do código, formando as assinaturas apropriadas à medida que vai avançando. Cria a primeira assinatura sem qualquer problema. Chega ao segundo e já tem um. Assim, há um erro na segunda linha.
Então porque é que se compila em MQL sem erros?
Resultado: MQL C++
vazio f<A>() vazio f<g1::A>()
vazio f<A>() vazio f<g2::A>()
Porque é que as assinaturas são criadas aqui sem qualquer interferência?
Então porque é que se compila em MQL sem erros?
Resultado: MQL C++
vazio f<A>() vazio f<g1::A>()
vazio f<A>() vazio f<g2::A>()
Porque é que as assinaturas são criadas aqui sem qualquer interferência?
Uma só é criada. Além disso, em f não se pode usar T. De qualquer modo, a situação é óbvia para mim.