错误C2327:不是类型名称、静态或枚举器-仅限MSVC14
Error C2327: not a type name, static, or enumerator - MSVC14 only
我有一段代码可以在GCC 5.3、MSVC12和clang 3.7中编译得很好。但是,MSVC14中没有。它试图以某种方式使用成员而不是命名空间,我真的不知道这里发生了什么。
#include <QtCore/qglobal.h>
namespace data
{
class Bar {};
}
struct Parent
{
int data;
};
namespace other
{
struct Foo : public Parent
{
void foo(data::Bar);
};
}
void other::Foo::foo(data::Bar) { }
int main()
{
return 0;
}
中的结果
cl -c -nologo -Zc:wchar_t -FS -Zc:strictStrings -Zc:throwingNew -Zi -MDd -GR -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577 -EHsc /Fddebugbug.pdb -DUNICODE -DWIN32 -DWIN64 -DQT_QML_DEBUG -DQT_CORE_LIB -I..bug -I. -IE:QtQt5.6.05.6msvc2015_64include -IE:QtQt5.6.05.6msvc2015_64includeQtCore -Idebug -IE:QtQt5.6.05.6msvc2015_64mkspecswin32-msvc2015
main.cpp
..bugmain.cpp(21): error C2327: 'Parent::data': is not a type name, static, or enumerator
注意,这是一个Qt项目,如果我删除include,它编译正常。基本上,如果我更改代码中的任何内容,它编译都正常。例如,这项工作:
namespace other
{
void Foo::foo(data::Bar) { }
}
如果我重命名成员变量数据或命名空间数据,它也可以工作。然而,我在现实中无法进行这些更改,声明是由qmake生成的代码,重命名命名空间不是一个选项。
这可能是编译器错误吗?知道吗?
在线21
:
void other::Foo::foo(data::Bar) { }
data
可能是一个不明确的标识符:
- 数据命名空间
- 类
Parent
的数据成员变量 xutility
中定义的数据函数之一包括近线1484
(在标准安装上,它位于C:Program Files (x86)Microsoft Visual Studio 14.0VCincludexutility
中)。CCD_ 7被CCD_
似乎删除3中的任何一个都可以使编译器解决歧义。其他编译器肯定不会有问题,因为xutility
头中没有数据函数,甚至xutility
文件也不存在。
为了解决歧义,将第21行替换为:
void other::Foo::foo(::data::Bar) { }
如果以后还有其他地方必须解决歧义,请根据上下文使用其中一个:
::data
Parent::data
this->data
data
是不明确的,因为Parent
已经有了该名称的成员,编译器试图解析其不存在的成员Bar
,它是一个变量(将其视为对象),而不是类或命名空间。
我建议重命名名称空间以避免歧义和混淆,例如使用CamelCase(Data
),因为应该为变量/实例/对象保留小写名称。如果这不是一个选项,请尝试通过全局名称空间访问它:
void foo(::data::Bar);
相关文章:
- C++两个源文件之间共享的枚举的静态实例
- 枚举成员与静态 int 成员?
- 枚举不是非静态数据成员或类的基类
- 大括号使用枚举类初始化静态常量unordered_map
- 为什么将FMTFLAG指定两次 - 作为枚举的一部分,而另一个实例为静态const变量
- C++静态枚举类成员的"多重定义"编译错误
- 在类外部定义静态匿名枚举
- 枚举和静态const成员变量在模板特征类中的用法
- 在性能和内存使用方面,“静态const”,“ #define”和“枚举”之间的差异
- 通过显式转换函数初始化枚举类类型的静态constexpr类成员
- 静态constexpr int与老式枚举:何时以及为什么
- 错误C2327:不是类型名称、静态或枚举器-仅限MSVC14
- 枚举静态转换为布尔,编译器发出性能警告
- C++在类中声明静态枚举与枚举
- 无法获取库上的枚举(未定义的引用静态元对象)
- 枚举与静态常量
- 错误 C2327:不是类型名称、静态或枚举器
- 在 c++ 中定义枚举类型的静态变量
- 如何静态断言枚举元素的值
- C++ dynamic_cast vs 将对象类型存储在静态枚举中