【发布时间】:2017-10-29 11:04:13
【问题描述】:
我有一个带有 MS Visual Studio 2015 的大型 C++11 项目,它在两个模块(= 编译单元、cpp 文件)中定义了两个名称相同但内容不同的结构。由于结构仅在模块中定义和使用,而不是通过任何头文件导出以供共享使用,因此应该允许这样做,实际上编译器和链接器都不会报告任何错误或警告。但是在运行时,我从包含该结构的无序映射的构造函数中得到访问冲突。 Visual Studio 2017 也会出现此问题,但 gcc5.4 不会出现此问题。在我看来,这是一个编译器错误,但我不确定。 这是一些重现问题的最小化源代码,只需与任何可执行文件链接即可在 main() 之前的启动期间获取访问冲突。
模块1.cpp:
#include <unordered_map>
struct AmbigousStruct {
int i1;
int i2;
int i3;
};
static const std::unordered_map<int, AmbigousStruct>
s_ambigousStructMap{
{ 0, { 0, 1, 2 } }
};
module2.cpp:
#include <unordered_map>
struct AmbigousStruct {
int i1;
int i2;
};
static const std::unordered_map<int, AmbigousStruct>
s_ambigousStructMap{
{ 0, { 0, 1 } }
};
问题似乎与在模板类(本例中为 unordered_map)中使用结构有关,因为它不会发生在结构的简单实例中,即 module2.cpp:
static const AmbigousStruct s_ambigousStructInstance{ 0, 1 };
【问题讨论】:
-
这就是
namespace解决的问题!
标签: c++ visual-studio c++11 struct compiler-bug