为什么C ++不允许const :::

时间:2013-11-08 18:46:25

标签: c++ scope-resolution

民间,

问题陈述 - C ++是否允许(静态)const限于类范围,因此我可以摆脱污染整个命名空间的#defines?

我的观察结果是NO(在以下不同的例子中),我想知道为什么以及什么是最好的选择。 VS生成错误C2589:'const':'::'

右侧的非法令牌

EXAMPLE1

// a.h

A班 {

…
.. 
static const uint_32 myConst = 1234;

};

// b.cpp

包括“a.h”

... B() {     uint32_t arr [A :: myConst]; // C2589! const:'::'右侧的非法令牌 }

示例2

// a.h

A班 {     ...     ..     恩琅     {         ...         myConst = 1234,         ..     }; };

// b.cpp

包括“a.h”

... B() {     uint32_t arr [A :: myConst]; // C2589! const:'::'右侧的非法令牌 }

3 个答案:

答案 0 :(得分:12)

当你拿走你的宏:

#define CONST 1234

并将其替换为您使用它的位置:

static const int CONST = 1234;

最终结果是胡说八道:

static const int 1234 = 1234;

在另一个例子中:

   Int a1[a::CONST];  

这也是无稽之谈:

   Int a1[a::1234];  

这一切都引出了一个问题,你尝试做什么?


看起来您正在尝试使用与您的宏CONST相同的名称创建一个成员变量,此处:

class A
{
  static const int CONST = 1234;
};

然而,由于编译此代码时宏已经被定义,因此预处理器通过在编译器本身可以获得破解之前替换宏来改变它。编译代码时,它看起来像这样:

class A
{
  static const int 1234 = 1234;
};

最好是完全取消宏,然后改进你的代码以使用适当的常量,就像你试图在这里做的那样。不要混搭。至少,不要为成员使用与宏相同的名称。

答案 1 :(得分:6)

首先,您的课程称为A,与首都A相同,而不是a。类名用于限定您尝试使用的常量。因此,请将代码更改为使用A::CONST。顺便说一句,这是C ++而不是C#或Java,因此没有Int这样的东西,除非出于某种奇怪的原因你决定发明自己的整数类型。

顺便说一下,使用全部大写来命名常量可能会与宏发生碰撞,这是一个很好的方法,特别是因为预处理首先发生,宏代替常量的所有情况。这通常会导致无效的C ++代码出现难以理解的语法错误。这就是为什么你永远不应该使用全部大写来命名常量,因为这是最常用于宏的约定。

答案 2 :(得分:0)

如果我可以猜测,看起来您尝试使用::的方式与在Python中使用.的方式相同。

看起来你真的不明白范围解析操作符的作用或它是如何工作的。

::具有非常具体且非常有限的用法。在你更好地理解它之前,我们将很难帮助你。