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

时间:2016-04-29 12:14:35

标签: c++ qt visual-c++ visual-studio-2015

我有一个代码可以在GCC 5.3,MSVC12和clang 3.7中编译好。但是,它不在MSVC14中。它以某种方式尝试使用成员而不是命名空间,我真的不知道这里发生了什么。

dwarfdump *.dSYM | grep "hidden"

结果

#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;
}

请注意,这是一个Qt项目,如果删除include,它会编译好。基本上如果我在这段代码中更改了任何内容,它就可以编译好了。例如,这有效:

    cl -c -nologo -Zc:wchar_t -FS -Zc:strictStrings -Zc:throwingNew -Zi -MDd -GR -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577 -EHsc /Fddebug\bug.pdb -DUNICODE -DWIN32 -DWIN64 -DQT_QML_DEBUG -DQT_CORE_LIB -I..\bug -I. -IE:\Qt\Qt5.6.0\5.6\msvc2015_64\include -IE:\Qt\Qt5.6.0\5.6\msvc2015_64\include\QtCore -Idebug -IE:\Qt\Qt5.6.0\5.6\msvc2015_64\mkspecs\win32-msvc2015
main.cpp
..\bug\main.cpp(21): error C2327: 'Parent::data': is not a type name, static, or enumerator

如果我重命名成员变量数据或命名空间数据,它也可以。但是我无法在现实中进行这些更改,声明是由qmake生成的代码,并且命名空间不是重命名。

这可能是编译器错误吗?有什么想法吗?

2 个答案:

答案 0 :(得分:1)

data含糊不清,因为Parent已经拥有该名称的成员,编译器会尝试解析其成员Bar,它不是变量(将其视为对象而不是类或命名空间。

我建议重命名命名空间以避免歧义和混淆,例如: G。使用CamelCase(Data),因为应为变量/实例/对象保留小写名称。如果这不是一个选项,请尝试通过全局命名空间访问它:

void foo(::data::Bar);

答案 1 :(得分:1)

在线21

void other::Foo::foo(data::Bar) { }

data是一个含糊不清的标识符,因为它可以是:

  • 数据名称空间。
  • Parent的数据成员变量。
  • xutility中定义的其中一个数据函数包括近线1484(在标准安装中,它位于C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\xutility)。 xutility间接包含#include <QtCore/qglobal.h>

似乎删除3中的任何一个使得编译器解决了歧义。您肯定没有其他编译器的问题,因为xutility标头中没有数据函数,甚至xutility文件也不存在。

要解决歧义,请将第21行替换为:

void other::Foo::foo(::data::Bar) { }

如果以后有其他地方你必须解决歧义,请根据具体情况使用其中一个:

  • ::data
  • Parent::data
  • this->data