类内using定义的byte类型别名作返回类型为何需加类作用域?
类内定义的类型别名作为返回类型需指定作用域的原因
这是C++名称查找规则导致的差异,核心在于返回类型和参数列表的查找时机、作用域不同:
为什么参数里的byte能直接使用
当你在实现文件里写void AClass::setData(byte data)时,编译器看到AClass::setData的瞬间,就已经明确这是AClass的成员函数,参数列表里的名称会优先在AClass的作用域内查找。所以这里的byte能直接匹配到类里用using定义的别名,不需要额外限定。
为什么返回类型必须加AClass::
返回类型写在AClass::getData()的前面,此时编译器还未进入AClass的作用域,它只会在全局作用域、当前文件已引入的命名空间里查找byte。如果全局/其他命名空间里没有定义byte,就会报'byte does not name a type'的错误。必须显式用AClass::byte限定作用域,编译器才能找到类内定义的别名。
替代方案:尾随返回类型
如果你觉得每次加类作用域麻烦,可以用C++11引入的尾随返回类型写法,此时返回类型的查找会进入类作用域,不用额外限定:
auto AClass::getData() -> byte* { // 函数实现 }
示例代码
头文件AClass.h:
#include <cstdint> class AClass { public: using byte = uint8_t; void setData(byte data); byte* getData(); };
实现文件AClass.cpp:
#include "AClass.h" // 参数的byte可直接使用 void AClass::setData(byte data) { // ... } // 必须指定类作用域的正确写法 AClass::byte* AClass::getData() { // ... } // 尾随返回类型的写法(无需类作用域) auto AClass::getData() -> byte* { // ... }
内容的提问来源于stack exchange,提问作者E_3
相关产品推荐
相关产品推荐

