民间,
问题陈述 - C ++是否允许(静态)const限于类范围,因此我可以摆脱污染整个命名空间的#defines?
我的观察结果是NO(在以下不同的例子中),我想知道为什么以及什么是最好的选择。 VS生成错误C2589:'const':'::'
右侧的非法令牌// a.h
A班 {
…
..
static const uint_32 myConst = 1234;
};
// b.cpp
... B() { uint32_t arr [A :: myConst]; // C2589! const:'::'右侧的非法令牌 }
// a.h
A班 { ... .. 恩琅 { ... myConst = 1234, .. }; };
// b.cpp
... B() { uint32_t arr [A :: myConst]; // C2589! const:'::'右侧的非法令牌 }
答案 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中使用.
的方式相同。
看起来你真的不明白范围解析操作符的作用或它是如何工作的。
::
具有非常具体且非常有限的用法。在你更好地理解它之前,我们将很难帮助你。