返回数组常量引用的类方法添加override编译失败问题
编译失败的原因
这是C++语法解析的优先级导致的问题。当你用const int (&getDataRef())[100]这种传统风格声明返回数组引用的函数时,编译器会将[100]视为函数声明的收尾部分,认为此处应该以分号结束。后续的override关键字会被编译器误判为新的声明内容,既无法识别它是重写标识,还会报错说它是未知类型。
无需typedef的解决方法
使用C++11引入的**尾置返回类型(trailing return type)**可以解决这个问题,这种写法能让函数的结构更清晰,编译器可以正确识别override的位置:
修改后的完整代码示例
#include <iostream> class iMyClass { public: // 可选:基类也改用尾置返回类型提升可读性 virtual auto getDataRef() -> const int (&)[100] = 0; }; class MyClass : public iMyClass { public: MyClass(): arr{}{}; // 用尾置返回类型声明,override位置符合语法要求 auto getDataRef() -> const int (&)[100] override; void set() {arr[5] = 5;}; private: int arr[100]; }; // 类外定义同步使用尾置返回类型(风格统一) auto MyClass::getDataRef() -> const int (&)[100] { return arr; } int main() { MyClass a; const int (&brr)[100] = a.getDataRef(); a.set(); std::cout << brr[5]; return 0; }
这样修改后,编译器能正确识别override是重写基类虚函数的标识,代码可以正常编译运行,输出结果依然是5。
内容的提问来源于stack exchange,提问作者Nicolas Zurlinden
相关产品推荐
相关产品推荐

