gpt4 book ai didi

c++ - 类型定义枚举的问题。和 visual studio 2005 中的错误

转载 作者:太空狗 更新时间:2023-10-29 20:17:46 26 4
gpt4 key购买 nike

struct A
{
enum E
{
FIRST,
SECOND
};
};

struct B
{
typedef A::E E;
};

int main()
{
B::E e0 = A::FIRST;//OK (this case is clear for me)
B::E e1 = A::E::FIRST;//OK (this case is clear for me as well)
B::E e2 = B::FIRST;//Compile Error: FIRST is not member of B (Why isn't this allowed? Don't we lose meaning of typedef of enums in this case?)
B::E e3 = B::E::FIRST;//Error of compiler (If there were no bug in visual studio 2005 compiler, would this code work?)
return 0;
}

附言代码中的问题。

更新:实际上该错误已在 VS2010 中修复。

最佳答案

B::E e3 = B::E::FIRST 中添加缺少的分号后,以下成立:

在C++03中只有第一行(B::E e0 = A::FIRST;)是正确的,其他三行是错误的:

B::E e1 = A::E::FIRST; // error: ‘A::E’ is not a class or namespace
B::E e2 = B::FIRST; // error: ‘FIRST’ is not a member of ‘B’
B::E e3 = B::E::FIRST; // error: ‘B::E’ is not a class or namespace

在C++0x中,只有第二行(B::E e2 = B::FIRST;)是错误的(FIRST仍然不是B的成员!),其他的三个是正确的。

不是对“为什么?”的回答,只是指出手头有两个不同的问题。影响 e1 和 e3 的问题的基本原理可能在 C++0x 工作文件中有解释。

改变的是 3.4.3[basic.lookup.qual]/1 的第一句,现在是

The name of a class or namespace member or enumerator can be referred to after the :: scope resolution operator

但它曾经说过

The name of a class or namespace member can be referred to after the :: scope resolution operator

关于c++ - 类型定义枚举的问题。和 visual studio 2005 中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6027955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com