错误、漏洞、问题 - 页 1639

 

现在谁来解决这个问题,当一个模板类中的模板方法由于某种原因没有被编译器找到而发生错误时?

no one of overloads can be applied to the function call

?

在这种情况下,C语言编译器会具体写出被替换的类型,以及找不到什么原型的函数,所以或多或少能看出问题所在,但这里--没有具体说明。

 
Ilyas:
我们是故意这样做的,因为直接继承没有问题。

我想看看确切的规则:什么时候我有权用不同类型的返回值来覆盖一个虚拟函数

还是超载?

 
Koldun Zloy:

我想看看确切的规则:什么时候我有权用不同类型的返回值来覆盖一个虚拟函数

只有一种情况,当返回一个指向类对象的指针时,被覆盖函数的返回类型继承了(在多重继承中是第一父类,在MQL中还不支持)被覆盖函数返回的类型。
 

谢谢你。这一切都很有意义。

 
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; } //нормально
};
一种情况下有错误,另一种情况下没有错误。而我只是换了一下线