在头文件中定义的模板类成员函数中使用命名空间

时间:2012-10-16 15:28:02

标签: c++ templates header-files

我是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::

3 个答案:

答案 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,但不建议这样做。