Erreurs, bugs, questions - page 1920

 
A100:

Et public : devrait/ne devrait pas ?

champ statique public - doit.
 
fxsaber:
Le champ statique public est indispensable.
Pour résumer : la classe de base ne voit pas le champ non statique de la classe dérivée. Dans le même temps, la classe de base ne voit pas le protected static du dérivé, mais le public static. Avez-vous inventé cette règle vous-même ?
 
A100:
En résumé, une classe de base ne voit pas les champs non statiques d'une classe dérivée. En même temps, la classe de base ne voit pas le protected static de la classe dérivée, mais le public static. Avez-vous inventé cette règle vous-même ?

Il m'est difficile de dire où de telles généralisations sont faites. Je n'avais pas du tout cette idée en tête moi-même.

Toute classe voit les champs/méthodes statiques publics de toute autre classe.

La classe de base ne voit jamais les champs/méthodes protégés/privés (statiques - peu importe) de la classe dérivée (héritage public).

Une classe dérivée(héritage public) ne voit jamais les champs/méthodes privés d'une classe de base, mais voit toujours protected/public.

 
fxsaber:

Toute classe voit les champs/méthodes statiques publics de toute autre classe.

Au final, la question se résume à ceci : Est-il exact qu'en MQL, les champs/méthodes statiques publics d'une classe dérivée sont disponibles dans une classe de base ?
 
A100:
Au final, la question se résume à ceci : Est-il exact qu'en MQL, la classe de base possède des champs/méthodes statiques publics de la classe dérivée ?

Ceci est correct non seulement pour le cas de la base/dérivée, mais pour toutes les classes en général.

 
fxsaber:

Ceci est correct non seulement pour le cas base/dérivée, mais pour toutes les classes en général.

La question n'a pas surgi du néant

#ifdef __cplusplus
struct B;
struct A {
        int f() { return B::i; } //error E2451
};
struct B : A {
        static int i;
};
int B::i;
#endif
et doit donc être vérifié en détail
 
fxsaber:

Toute classe voit les champs/méthodes statiques publics de toute autre classe.

... Y compris la classe de base. D'où la contradiction suivante dans MQL

struct A {
        static int i;
};
int A::i;
struct B : private A {};
struct C : B {
        C() { Print( A::i ); } //error: 'i' - private member access error
};
C++ sans erreurs
 
A100:

En C++ par défaut dans les structures les membres sont publics, en mql privés, comme dans les classes.

Oui, j'avais tort, il manque la déclaration forward en C++, nous avons besoin de la définition

 
A100:

... y compris celle de base. D'où la contradiction suivante dans MQL

C++ sans erreurs

Oui, c'est un bogue dans l'héritage privé de MQL.

 

Erreur de compilation

template<typename T1, typename T2>
void f( T2 t )
{
        Print( typename( T1 ), ":", typename( T2 ), ":", t );
}
void OnStart()
{
        char ch = 5;
        f<int>( ch ); //(1) //error: 'f' - wrong template parameters count
}

Un dossier est constitué

         f<int,char>( ch ); //(2)
qui contient des informations redondantes et de plus une ambiguïté si ch n'est pas char. De plus, dans les macros, les informations sur le type de ch ne sont généralement pas disponibles (cela dépend du contexte).