我有一个头文件MyNameSpace.h,我在下面使用命名空间:
namespace NameSpace1
{
string first = "First";
...
}
namespace NameSpace2
{
string top = "Top";
}
但是当我在其他类中使用名称空间对象时,包括头文件。我得到了NameSpace1 :: first的重复符号错误。具体含义以及如何解决此解决方案。
答案 0 :(得分:15)
你不应该在头文件中定义全局变量,你需要告诉编译器它使用extern
关键字在别处定义。否则,编译器会尝试在包含标头的每个源文件中定义变量。
EG。在MyNameSpace.h中你可以:
namespace NameSpace1 {
extern std::string first;
}
然后你将在MyNameSpace.cpp中执行此操作:
namespace NameSpace1 {
std::string first = "First";
}
答案 1 :(得分:0)
首先,不能有命名空间对象,不能从命名空间中创建对象。它仅用于名称解析。关于多重定义问题,您很可能错过了头文件的include guard。
答案 2 :(得分:0)
@reko_t:包含保护对多个变量定义没有帮助,因为包含保护仅保护每个单个编译单元的多个包含(例如,源文件)。
这实际上不是在阻止多个定义吗?