Erros, bugs, perguntas - página 1965

 
fxsaber:

Exactamente! Agora posso chamar f todos os tipos de funções e variáveis de uma só vez. Deve haver algum senso comum em tais ambiguidades, de modo a não causar erros acidentais. Na minha opinião, é lógico bamboozle, emitindo um fio vazio para dactilografar f, em vez de causar problemas quando se apanha e define acidentalmente outro f.

Não seja tão teimoso na procura do bom senso em todo o lado, especialmente entre os insectos. Se o ouvir, qualquer erro no MQL não é de todo um erro, mas uma característica que foi incluída pelos programadores sábios ))

Como já foi referido, se tiver dúvidas, a primeira coisa a fazer é verificá-lo em C++, e depois encontrar uma solução.

Quanto às ambiguidades, devem causar um erro de compilação e sem problemas. Tudo era claro e inequívoco na amostra A100, por isso não percebo bem o que quer dizer. Se precisar de sobrecarregar uma função, sobrecarrega-a e corrige os erros de compilação em ambiguidades e pronto.

 

Como é que inicializo um membro estático de uma classe modelo em MQL?

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

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

Como é que inicializo um membro estático de uma classe modelo em MQL?

Se for um problema simples, traga-o para uma classe de base sem chapa e herde-o. Em geral, não sei como.
 
Stanislav Korotky:

Como é que inicializo um membro estático de uma classe modelo em MQL?

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

A100:

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

Em geral, claro, este método não corresponde ao C++, mas funciona em MQL.

Tive um problema semelhante com o método fora da classe:

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

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

Graças a si, a solução foi encontrada:

template<typename T>
void A::f() { }
Embora isto também esteja errado, claro, porque significa definir um método de modelo, não um método de uma classe de modelo. E se uma classe contém ambas, haverá ambiguidade
 
Alexey Navoykov:

Tive um problema semelhante com a adopção de um método fora da aula:

É muito mais conveniente desta forma. A única restrição é que não se pode ter outra classe (como no exemplo) no meio

Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos

Erros, Erros, Perguntas

A100, 2016.05.19 23:26

Erro de compilação

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 um método de modelo em vez de um método de classe de modelo. E se a classe contiver ambas, haverá ambiguidade

Não haverá ambiguidade, tudo já foi pensado antes de nós (c). Precisamos de repetir a linha do modelo duas vezes (a linha superior referir-se-á a uma classe, a linha inferior a um método)
 
A100:
Não vai - tudo foi pensado antes de nós (c). Tem de repetir a linha do modelo duas vezes (a linha superior referir-se-á à classe - a linha inferior ao método)

Meu, isto parece mesmo confuso.

A100:
É muito mais conveniente dessa forma.

Sim, bem, não ter de pôr <T> é uma conveniência tão séria).

 
Alexey Navoykov:

Sim, não ter de pôr um <T> é uma conveniência tão séria).

Eu quis dizer que é conveniente ser capaz de colocar um método fora de uma classe
 
Alexey Navoykov:

Tive um problema semelhante com a adopção de um método fora da aula:

errado, claro, uma vez que significa definir um método de modelo em vez de um método de classe de modelo. E se a classe contiver ambas, haverá ambiguidade.

Noto que os métodos são frequentemente colocados fora da aula, mas porquê? Olhei através do SB, por isso os métodos "pequenos" são definidos numa só linha, os métodos "longos" são definidos fora da classe. Não há conveniência de percepção, porque ALT+G em definição externa oferece não um, mas dois pontos de transição. E se houver sobrecargas, então um múltiplo de dois, respectivamente. E a ALT+M já mostra tudo de uma só vez.

Talvez isto seja algum tipo de homenagem à clareza da definição da interface, mas até agora ainda não entrei nela.