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的未定义引用。链接对象文件时出现此错误。我前面的语句仍然有效。要回答第二个问题,您可以将变量包装在一个单例类中,而不是使其成为全局变量