C++ 对全局无序映射的未定义引用

C++ 对全局无序映射的未定义引用,c++,unordered-map,C++,Unordered Map,我有三个文件: TableGenerataor.h TableGenerataor.cpp Analyzer.cpp 我在TableGenerator.h中声明了无序_映射,并使用它在TableGenerator.cpp中创建无序_映射的对象 map_t obj1; data d; 表生成器.h namespace N { typedef std::tuple<int, char> key_t; struct key_hash : public std::unary_func

我有三个文件:

TableGenerataor.h
TableGenerataor.cpp
Analyzer.cpp
我在TableGenerator.h中声明了无序_映射,并使用它在TableGenerator.cpp中创建无序_映射的对象

map_t obj1;
data d;
表生成器.h

namespace N {

typedef std::tuple<int, char> key_t;

struct key_hash : public std::unary_function<key_t, std::size_t>
{
std::size_t operator()(const key_t& k) const
{
return std::get<0>(k) ^ std::get<1>(k) ;
}
};

struct key_equal : public std::binary_function<key_t, key_t, bool>
{
bool operator()(const key_t& v0, const key_t& v1) const
{
return (
std::get<0>(v0) == std::get<0>(v1) &&
std::get<1>(v0) == std::get<1>(v1) 
);
}
};

struct data
{
int AlertNo;

};

typedef std::unordered_map<const key_t,data,key_hash,key_equal> map_t;

}

enter code here
名称空间N{
typedef std::元组键;
结构键\u散列:公共std::一元\u函数
{
std::size\u t运算符()(常数键\u t&k)常数
{
返回std::get(k)^std::get(k);
}
};
结构key_equal:public std::binary_函数
{
布尔运算符()(常数键t&v0,常数键t&v1)常数
{
返回(
标准::获取(v0)=标准::获取(v1)&&
标准::获取(v0)=标准::获取(v1)
);
}
};
结构数据
{
int ALERTINO;
};
typedef std::无序映射;
}
在这里输入代码
我想使用Analyzer.cpp中TableGenerator.cpp文件中创建的无序_映射。我想把这张无序的地图保留到节目结束。为此,我想使无序的_地图全球化。全局似乎比将map作为参数发送给其他函数更好。我在Analyzer.cpp中使用关键字extern

外部映射对象J1; 外部数据d


但它仍然表示编译时未定义对obj1的引用。请帮助我如何使无序映射全局化,以便在其他cpp文件中使用它。第二,他们还有其他更好的方法来做这件事,而不是让地图全球化

听起来你有语法问题

请参阅这些资源以查看一些示例:

  • 短,甜:

  • 极其详细和完整:


变量声明是否与其定义位于同一命名空间中?例如,可能已定义了
N::obj1
,但引用了
obj1


原始答复:

您在Analyzer.cpp中写道:

extern map_t obj1;
extern data d;
所以我想你有

#include "TableGenerator.h"
在“Analyzer.cpp”中

将两个全局变量的声明移动到“TableGenerator.h”。(将它们的定义保留在“TableGenerator.cpp”中。)


并尝试访问“Analyzer.cpp”中的
N::obj1
N::d

我认为这与全局是一个
无序的地图没有任何关系
@juanchopanza我编辑了我的问题,而编译时它说的是对obj1的未定义引用。链接对象文件时出现此错误。我前面的语句仍然有效。要回答第二个问题,您可以将变量包装在一个单例类中,而不是使其成为全局变量