エラー、バグ、質問 - ページ 1087

 

後置演算子++の省略表記は、ベースクラスのポインタを派生クラスのポインタに明示的に変換した場合、コンパイルできない。

class A {
};

class B : public A {
public:
        void    operator++( int ) {}
        void    operator++()      {}
};

void f( A* a )
{
        ((B *)a).operator++( 0 ); //нормально
        ((B *)a).operator++();    //нормально
        ++((B *)a);               //нормально
        ((B *)a)++;               //ошибка
}
 
少なくとも,コンパイラは a.f() が const でないことを警告 する必要があります。
class A {
public:
        int f() { return ( 1 ); }
};

class B {
public:
                B( const A *aa ) : a( aa ) {}
        int g() { return ( a.f() ); } //должно быть предупреждение, поскольку a.f() не const
        const A *a;
};
 
A100:
少なくとも,コンパイラは a.f() が const でないことを警告 する必要があります。
ご精進いただきありがとうございます。どちらのエラーも修正いたしました。
 
mql5:
ご指摘ありがとうございます。どちらのエラーも修正しました。
最後の1つだけは、厳密にはエラーではなく、警告だけであるべきです。の場合のみエラーとなります。
class B {
public:
        A * const a;
};

でも、テンプレートでは。 後ほど例を挙げますね。

 

ここも......はっきりしない。

class A {
public:
};

void ex1( const A* &t1, const A* &t2 )
{
        const A* t = t1;
        t1 = t2;
        t2 = t;
}

void OnStart()
{
    const A *a1 = new A(), *a2 = new A();
    Print( "Было :" a1, " ", a2 ); // Было :1 2
    ex1( a1, a2 );
    Print( "Стало:"  a1, " ", a2 ); // Стало:2 1
    delete( a1 );
    delete( a2 );
}

はすべて正常に動作しますが、中間関数ex2(...)を追加すると

void ex2( const A* &t1, const A* &t2 ) { ex1( t1, t2 ); }

void OnStart()
{
    сonst A *a1 = new A(), *a2 = new A();
    Print( "Было: ", a1, " ",  a2 ); // Было :1 2
    ex2( a1, a2 );
    Print( "Стало:",  a1, " ",  a2 ); // Cтало:2 2           <-----
    delete( a1 ); delete( a2 );
}

結果が違うんです。ex2(...)は何をしたのですか?- でポインタを参照渡しにしただけです。

をご覧ください。

 
A100:

ここも......はっきりしない。

はすべて正常に動作しますが、中間関数ex2(...)を追加すると

結果が違うんです。ex2(...)は何をしたのですか?- でポインタを参照渡しにしただけです。

をご覧ください。

ありがとうございます、言語オプティマイザーのエラー、修正しました。
 

今に始まったことではありませんが、アップロード時にそのような写真が出るということは、何らかの条件(サイズが決まっているのでしょう)を設定しなければなりません。
).それ以外の場所では普通に表示されます。何が問題なのか、教えてください。


 
マクロで結果型の変換を行い、その戻り値を使用しない場合、不要なコンパイルエラーが 発生する(必要な場合と不要な場合がある)。
int g( int x ) { return ( x ); }

#define  F( X )    (long)g( X )

void OnStart()
{
        int f = F( 0 ); //нормально
        F( 0 );         //ошибка компиляции
}
 
A100:
マクロで結果型の変換を行い、その戻り値がその後使用されない場合、不要なコンパイルエラーが 発生する(必要な場合と不要な場合がある)。

これは、defineの使用とは関係ない。

単純にdefineと同等にしても、同じエラーが発生します。

(long)g(0);


'(long)' - expression has no effect


P.S. 今度はここにボーニングが登場します。

 

インジケーターを再コンパイルすると、動的配列を 扱うときに「array out of range」エラーが発生するようになりました。

以前は発生しなかった。どうすればいいのか?

Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5