我试图在下面的极简主义示例中质疑我自己的代码正确性,其中头文件将标识符提升到当前名称空间。
#include <string>
namespace mine {
using std::string; // std::string lifted into mine
struct agent
{
string name;
};
}
这是我最近提出的另一种使用typedef的替代方法:
#include <string>
struct agent
{
private:
typedef std::string string;
public:
string name;
};
我认为第一个选项更正确,因为它使用了我自己的命名空间,这是一个应该习惯的实践(命名空间创建和管理)。因为标识符在我控制的命名空间内被提升,所以它是一种安全的方法。
然而,我有第二个想法。例如,不小心使用命名空间 mine ,例如使用using指令,也会将std :: string带入视图。另一个问题是我暴露了std :: string太多了。甚至可能是命名空间 mine 的区域,在那里没有必要或不可取。
在我看来,始终在尽可能低的范围内工作并从那里开始工作似乎更为正确。只暴露绝对必要的。我在第二个例子中将typedef设为私有的事实正是因为这个原因。但是后来我没有按照第二个例子的建议。
但另一方面,我担心的是有人可能滥用名称空间 mine :
using namespace mine;
乍一看,我们知道这不是命名空间的正确使用模式。但不可否认,有些情况可能是可取的。您认为第一种方法有多有效?
答案 0 :(得分:8)
我认为显而易见的解决方案是:
namespace mine {
struct agent
{
std::string name;
};
}
我个人根本不在头文件中使用using指令。当然,在实现文件中。
答案 1 :(得分:7)
我通常这样做:
// In header file:
#include <string>
namespace mine {
struct agent
{
std::string name;
};
}
// In source file:
using std::string;
namespace mine {
// Code
}
这样你就不必在实现中一遍又一遍地写出std ::但是你可以避免使用你的头文件无意中导入std :: symbols的问题。
答案 2 :(得分:1)
我通常这样做:
// In header file
#include <string>
namespace mine
{
namespace detail
{
using std::string;
struct agent
{
string name;
}
}
using detail::agent;
}
这样我就不必在标题中输入std::
,但有人仍然可以执行using namespace mine;
而不会从std
导入名称。