具有类名的数据成员

Posted

技术标签:

【中文标题】具有类名的数据成员【英文标题】:data member with the class name 【发布时间】:2015-11-01 02:24:42 【问题描述】:

标准说, “如果成员是静态数据成员、成员函数、成员类型、成员模板、无作用域枚举的枚举器、成员匿名联合的成员,则类 T 的成员不能使用 T 作为其名称。但是,只要没有用户声明的构造函数,非静态数据成员就可以使用名称 T。”

但是,如果我创建此类,则会出现编译错误。

class G

    int G;
;

我正在使用 VS2013。微软不允许吗?

【问题讨论】:

什么是编译错误?这适用于 Clang 和 GCC。 微软编译器因不符合任何标准而(臭名昭著)。 error: C2380: type(s) before 'G' (constructor with return type, or invalid redefinition of current class-name?) 所以,他们不允许这样做:( 我强烈建议以不同的方式命名类和成员。我从来没有遇到过这个问题,因为我的名字不同。 @ThomasMatthews 当然我也从未在实践中使用过。 【参考方案1】:

如果 VC++ 不允许这样做,那就是一个错误。

但是,这种语言“特性”是出于 C 兼容性的目的,微软决定不强调 C。例如,C99 特性在被 C++ 采用之前是不可用的。你不应该故意在 C++ 中声明这样的成员。

(在C语言中是默认允许的:成员的命名没有限制,所有成员都是非静态数据成员。)

【讨论】:

以上是关于具有类名的数据成员的主要内容,如果未能解决你的问题,请参考以下文章

Java——基础知识——类成员变量成员方法

days05--面向对象之封装

使用类成员作为类名访问静态成员

知识回顾2

离线成员函数定义是不是需要完全限定的类名到全局范围?

面向对象(OOP)