C++中能否通过类实例访问类内定义的成员类型别名?
为什么类内的类型别名不能通过实例对象的点运算符访问?
哈哈,这个误会太常见了!我刚接触C++的时候也犯过类似的错。你之前的认知确实有偏差——类内部用using或typedef声明的类型别名属于类级别的成员类型,它是和类本身绑定的,而非类的实例对象,所以只能通过类名搭配作用域解析符::来访问,根本没法用对象的点.运算符来引用。
你写的这段代码:
class klasa { public: using typ = int; }; int main() { klasa k; k.typ i = 0; return 0; }
编译器报错的原因很直接:它会把k.typ解析成试图访问对象k的一个名为typ的成员变量,但你的类里根本没有这个变量,只有一个类型别名,自然会抛出错误。
正确的访问方式
想要使用这个类型别名,唯一标准的方式是通过类名加:::
class klasa { public: using typ = int; }; int main() { // 正确:通过类名访问类成员类型 klasa::typ i = 0; // 如果你非要借助实例对象(其实没必要,只是语法小技巧) klasa k; decltype(k)::typ j = 1; // 用decltype(k)获取k的类型,再访问typ return 0; }
额外补充:为什么要这么设计?
类型别名是编译期就确定的类的一部分,它不依赖任何具体的实例对象存在——哪怕你一个类的对象都没创建,这个类型别名依然有效。所以用类名访问才符合逻辑,就像类的静态成员一样(虽然静态成员语法上允许用对象访问,但本质还是类的成员),类型别名是纯粹的类级别信息,和运行期的实例无关。
内容的提问来源于stack exchange,提问作者user4385532
相关产品推荐
相关产品推荐

