我有一个可以在GCC 5.3,MSVC12和clang 3.7中正常编译的代码。但是,它不在MSVC14中。它以某种方式尝试使用成员而不是 namespace ,我真的不知道这里发生了什么。
#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 /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
请注意,这是一个Qt项目,如果删除了include,它会编译确定。基本上,如果我更改此代码中的任何内容,它将编译确定。例如,这有效:
namespace other
{
void Foo::foo(data::Bar) { }
}
如果我重命名成员变量数据或 namespace 数据,它也可以工作。但是我无法在现实中进行这些更改,声明是通过qmake生成的,并且重命名 namespace 不是一种选择。
这可能是编译器错误吗?任何的想法?
最佳答案
在线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
header 中没有数据功能,甚至它们都不存在xutility
文件。要解决歧义,请将第21行替换为:
void other::Foo::foo(::data::Bar) { }
如果以后还有其他地方必须解决歧义,请根据上下文使用其中之一:
::data
Parent::data
this->data