使用命名类型的命名空间比使用命令类型的命名空间有什么用?何时使用它们中的每一个?
答案 0 :(得分:2)
namespace命令的声明类型将选定的命名符号引入 code 范围(并且在没有命名空间限定符的情况下,使相同命名空间中的其他符号不可访问)。
namespace命令的using类型将命名空间中的所有符号引入 code 范围 - 这意味着您不一定确切地知道引入了哪些符号(可能有未记录的符号或符号)从以前版本的库中遗留下来,或者......)。
答案 1 :(得分:2)
除了允许访问符号而不是命名空间的using声明之外,using声明还将符号带到声明的范围。 using指令仅影响查找。
答案 2 :(得分:0)
Jonathan已经恢复了using namespace foo;
和using foo::Bar;
之间的差异,但我认为他的回答很不幸。
首先:using namespace
不应出现在头文件中。通过这样做,您可能会因为符号冲突而无法与其他头文件一起使用...
第二:一般来说,你应该尽可能地限制符号的范围,你可能已经在编写代码时这样做了:
for (size_t i = 0; i < 5; ++i)
{
std::string myString = myVec.at(i);
if (myString == "Foo") { std::cout << "Found"; break; }
}
在myString
循环之外声明for
将是无用的(和污染)。事实上,这些建议可以在很多书中找到:
来自Scott Meyers的Effective C++,第26项:尽可能推迟变量定义。
来自Herb Sutter和Andrei Alexandrescu的C++ Coding Standard,第18项:尽可能在本地声明变量
没有理由不对using
声明做同样的事情。
第三:考虑using
的替代方案:命名空间别名和typedef
。
// foo.h
class Foo
{
public:
std::vector<std::string> getSynonyms(const std::string& s) const;
private:
typedef std::map< std::string, std::vector<std::string> > synonyms_type;
synonyms_type mSynonyms;
};
// foo.cpp (never in header, at general scope)
namespace fu = boost::fusion;
std::vector<std::string> Foo::getSynonyms(const std::string& s) const
{
synonyms_type::const_iterator it =
std::find(mSynonyms.begin(), mSynonyms.end(), s);
std::vector<std::string> result;
if (it != mSynonyms.end()) { result = it->second; }
return result;
}
有什么好处?
using
的输入,并允许轻松更改基础类型。