我有一个代码可以在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生成的代码,并且命名空间不是重命名。
这可能是编译器错误吗?有什么想法吗?
答案 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