【发布时间】:2016-06-09 12:36:46
【问题描述】:
我有以下代码:
struct A{};
struct Base {
virtual A& internal() = 0;
};
struct Derives : public Base {
auto& internal() override { // <-- conflicting return type
return internal_;
}
private:
A internal_;
};
int main() {
Derives d;
auto& internal = d.internal();
}
这无法以冲突的返回类型编译(在 coliru 上测试 - 使用 gcc) - 我的问题是为什么编译器不能推断出 internal_(因此返回类型)都是 A? auto 的类型是否在不同的编译阶段推导出来,例如检查虚拟覆盖的类型?当然,如果您将 auto 替换为正确的类型,这将编译 - 但这不是重点。
(这里是clang错误,gcc有点类似)
main.cpp:8:11: 错误:虚函数“内部”的返回类型是 与它覆盖的函数的返回类型不协变('auto &' 不是从 'A &' 派生的)
auto& internal() override { // <-- conflicting return type ~~~~~ ^main.cpp:4:16: 注意:被覆盖的虚函数在这里
virtual A& internal() = 0; ~~ ^生成 1 个错误。
【问题讨论】:
-
想知道为什么要将运行时多态性(虚拟函数)与优雅的编译器时类设计(模板)混合在一起?
-
@BeyelerStudios,我看了那个问题,但我不相信它是(虽然我可能是错的..)
-
在 Visual Studio 中我得到:“错误 C3542:
Derives::internal:虚拟成员函数不应具有包含auto的返回类型” -
@JonathanMee,没有 VS 的访问权限,所以无法用它进行测试...我想它对 gcc/clang 修复错误很有用,但是嘿嘿..
-
@sleeptightpupper,我不明白你的意思(如果你用真实类型替换
auto)上面的代码应该编译..