【发布时间】:2021-09-30 12:00:44
【问题描述】:
我们有很多不在任何命名空间中的类,它们广泛使用 std。
例如:
class MyClass
{
std::map<std::string,std::vector<std::string>> mLookup
...
这很乏味,但因为它是一个标题,我不能只做using namespace std;,否则我会造成严重的污染。
我也不能(我认为)将这个类移动到一个新的命名空间中,而不必在代码库的其余部分中对它的每次使用进行更新,这一切都开始成为一项严肃的任务。
所以我想检查一下,C++(17) 不 提供任何其他解决方案吗?我只需要完全指定事物或引入命名空间?
【问题讨论】:
-
17 或更高版本的编译器允许以下内容: " #include
using std::cout, std::cerr, std::endl, std::hex, std::dec; ”。在此包括以下,您可以以这种更简单的形式使用 cout、cerr、endl、hex 和 dec 函数(不带 std:: 前缀),它还可以防止 的许多其他 std:: 函数污染您的编译跨度> -
编译器允许这些语句的时间比 C++17 长 很多。
-
这仍然会污染我
use的东西,对吧?using中的something.h将被带到任何带有#include something.h的源/标头?这是一种改进,我同意。 -
从C++11开始,你可以在类定义中使用别名声明(例如
using mymap = std::map<std::string,std::vector<std::string>>,然后在MyClass中声明mymap mLookup。在类之外,该类型别名可以是像任何嵌套类型一样使用(例如MyClass::mymap a_map = some_object.mLookup)。 -
@peter 这可能是我正在寻找的答案!