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

 

テンプレートクラス内のテンプレートメソッドが何らかの理由でコンパイラに見つからず、エラーになった場合、今、誰がその問題を解決しているのでしょうか?

no one of overloads can be applied to the function call

?

Cコンパイラは、このような場合、どのような型を代入したのか、どのようなプロトタイプの関数が見つからないのかを具体的に書いてくれるので、何が問題なのかが大体わかるのだが、ここでは具体的なことは書いてくれない。

 
Ilyas:
直接的に継承しても問題がないため、あえてこのようにしました。

正確なルールを知りたいのですが、仮想関数を 異なる型の戻り値でオーバーライドする権利は、どのような場合にあるのでしょうか?

それともオーバーロード?

 
Koldun Zloy:

正確なルールを知りたいのですが、仮想関数を 異なる型の戻り値でオーバーライドする権利はいつあるのでしょうか?

クラス・オブジェクトへのポインタを返す場合、オーバーライドされた関数の戻り値の型が、オーバーライドされた関数の戻り値の型を継承する(多重継承では最初の親である、MQLではまだサポートされていない)場合が1つだけあります。
 

ありがとうございます。すべてに意味がある。

 
Ilyas:
...オーバーライドされた関数の戻り値の型が継承される場合 ...を、オーバーライドされたものが返す型から削除します。

逆の場合はどうでしょう?

class A {};
class B : public A {};
class C {
        virtual B *f() { return NULL; }
};
class D {
        virtual A *f() { return NULL; } //нормально
};
 
A100:

逆の場合はどうでしょう?

この例では、CからDへの継承が行われていません。
 
Ilyas:
この例では、CからDへの継承が行われていません。

はい、私のミスです、すみません。

class A {};
class B : A {};
class C {
        virtual B *f() { return NULL; }
};
class D : C {
        virtual A *f() { return NULL; } //Error: overriding virtual function with different return type
};
 

また、物議を醸した例です。

class C;
class A {
        virtual A *f() { return NULL; }
};
class B : A {
        virtual C *f() { return NULL; } //Error: overriding virtual function with different return type
};
class C : B {
        virtual C *f() { return NULL; } //нормально
};
 
A100:

また、物議を醸した例です。

実行ファイルが生成されないため)エラーは発生しますが、関数B::fはA::fをオーバーライドするため、C::fのオーバーライドエラーは発生しないことになります。
 
Ilyas:
実行ファイルが生成されないため)エラーは発生しますが、関数B::fはA::fをオーバーライドするため、C::fのオーバーライドエラーは発生しないことになります。

よくわからないけど、ほぼ同じような感じ

class C;
class A {
        virtual A *f() { return NULL; }
};
class B : A {
        virtual C *f() { return NULL; } //Error: overriding virtual function with different return type
};
class C : A {};
class C;
class A {
        virtual A *f() { return NULL; }
};
class C : A {};
class B : A {
        virtual C *f() { return NULL; } //нормально
};
一方にエラーがあり、もう一方にエラーがない。そして、ラインを入れ替えただけ