限制 `using` 指令只在当前文件中使用

5

非常抱歉问这个愚蠢的问题,但是否有办法限制using指令仅适用于当前文件,以便它们不会传播到包含此文件的文件中?


你可以将使用指令限制在非文件范围内,例如命名空间或函数。 - Steve Jessop
2
最好不要在头文件中应用 using 指令。 - David Rodríguez - dribeas
@David:我讨厌打这样的东西 std::map<std::string, std::tr1::tuple<int, std::string> >,我宁愿打 map<string, tuple<int, string> > - missingfaktor
3个回答

15
没有,这就是为什么你不应该在头文件或任何其他你使用#include的文件中使用using指令。

3
稍微扩展一下 - 预处理器(负责处理 #include 和其他 # 命令)在编译器看到代码之前运行。using 指令和其他标准关键字由编译器处理。因此,就编译器而言,头文件实际上并不是独立的文件 - 它们只是出现在每个包含它们的文件中的代码,因此其中任何你可能添加的 using 指令也是如此。 - Amber
2
啊...有点伤心。不管怎样,还是谢谢你的回答。 - missingfaktor
@Rahul,这并不糟糕 - 当然你可以(并且应该)在你的 .cpp 文件中使用 using 指令。 - anon

4
也许将需要包含的代码放在自己的命名空间中,可以实现您想要的行为,因为命名空间具有作用域影响。
// FILENAME is the file to be included
namespace FILENAME_NS {
   using namespace std;
   namespace INNER_NS {
      [wrapped code]
   }
}
using namespace FILENAME_NS::INNER_NS;

并且在另一个文件中

#include <FILENAME>
// std namespace is not visible, only INNER_NS definitions and declarations
...

嘿,很酷的技巧!我想我会选择这个; 非常感谢! :) - missingfaktor

4

从技术上讲,您应该能够将它们导入到一些内部名称空间中,然后使在该名称空间中声明的内容在用户所使用的名称空间中可见。

#ifndef HEADER_HPP
#define HEADER_HPP

#include <string>

namespace my_detail
{
    using std::string;
    inline string concatenate(const string& a, const string& b) { return a + b; }   
}

namespace my_namespace
{
    using my_detail::concatenate;
}

#endif

#include <iostream>
#include "header.hpp"

using namespace my_namespace;

int main() 
{
    std::  //required
    string a("Hello "), b("world!");
    std::cout << concatenate(a, b) << '\n';
}

我不确定这是否值得麻烦,以及它与“参数依赖查找”有多好的兼容性。


确实有点麻烦。但是这仍然是一个不错的解决方法。所以,点赞 +1. :) - missingfaktor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接