错误C2327:不是类型名称、静态或枚举器-仅限MSVC14

Error C2327: not a type name, static, or enumerator - MSVC14 only

本文关键字:枚举 静态 MSVC14 仅限 C2327 类型 错误      更新时间:2023-10-16

我有一段代码可以在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);