我是C ++的新手,但据我所知,在头文件中使用using namespace
关键字是不好的。我正在尝试编写一个模板类,并且已经读过模板类成员函数的定义必须在标题中,并且所有模板代码必须在同一个地方。我的问题是,如果没有using namespace
关键字,编写所有代码会很繁琐。例如,目前我有:
#ifndef RANDOMTREE_H_
#define RANDOMTREE_H_
template<class T>
class RandomTree {
private:
typedef double (*funcion_ptr) (T, T);
public:
RandomTree(std::vector<T> data, std::vector<funcion_ptr>){
...
}
void train_tree();
};
#endif /* RANDOMTREE_H_ */
但我打算在函数体中使用一些boost方法等,并想知道是否有办法不必输入前缀std::
和boost::
答案 0 :(得分:4)
嗯,这段代码看起来很不错。
在声明中写一次并不是什么大不了的事。
在定义中,如果您想省略编写ns::
,则可能在函数中包含using namespace ns;
。
或者,只需添加一些名称,例如:using ns::name;
。但我不会这样做。
答案 1 :(得分:2)
您也可以使用typedef:
typedef std::string string;
它的优点是不使用using
答案 2 :(得分:1)
无需键入资格(std::
,boost::
)的选项具有using
指令。如果有任何其他方式(在这种情况下不存在),它将带有与using
指令相同的问题,因此任何一种方法都同样糟糕。
请注意,using
不必应用于命名空间。例如,你可以这样做:
using std::string;
然后直接使用string
,但不建议这样做。