我在VS 2010中接近了这个奇怪的(对我来说)效果。 任何聪明的人都可以对它有所了解。
//Header.h
#include <string>
namespace MySpace {
extern const std::string SOME_CONST_STRING;
}
//Implementation.cpp
#include "Header.h"
using namespace MySpace;
const std::string SOME_CONST_STRING = "CONST_STRING_VALUE";
这会导致链接器输出错误LNK2001:未解析的外部符号const MySpace :: SOME_CONST_STRING。
但是,当我像这样更改Implementation.cpp时:
//Implementation.cpp
#include "Header.h"
namespace MySpace {
const std::string SOME_CONST_STRING = "CONST_STRING_VALUE";
}
代码构建正常。
是否更喜欢在cpp文件中定义命名空间而不是使用它?
答案 0 :(得分:0)
您也可以写:
const std::string MySpace::SOME_CONST_STRING = "CONST_STRING_VALUE";
该名称在MySpace
内声明,因此您必须这样称呼它。
答案 1 :(得分:0)
您在使用中缺少“命名空间”。它应该是这样的:
#include "Header.h"
using namespace MySpace;
const std::string SOME_CONST_STRING = "CONST_STRING_VALUE";
答案 2 :(得分:0)
命名空间的重点是特定命名空间中的名称与该命名空间之外的名称无关。一个程序可以同时拥有MySpace::SOME_CONST_STRING
和全局::SOME_CONST_STRING
,这两个完全不相关的符号。链接器使用一个定义来满足另一个的引用是错误的。
定义变量时,必须在命名空间中定义变量。