2012-10-16 31 views
2

定義的模板類成員函數使用命名空間我是新來的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_ */ 

但我打算用函數體裏面的一些加強方法等,並想知道是否有一種方法可以不用繼續鍵入前綴std::boost::

回答

4

那麼,這段代碼對我來說看起來不錯。

這不是什麼大不了的他們在聲明寫一次。

中的定義,如果你想省略寫ns::,你可能有using namespace ns;功能內。

或者,僅僅包括一些名字,比如:using ns::name;。但我不會那樣做。

+0

你爲什麼不那樣做? – Aly

+2

@Aly - 因爲如果我閱讀別人的代碼,我想知道他/她使用哪個名稱 - 他們來自哪個名稱空間。假設你有很多通用名稱,例如'String','Thread'或'Pipe'等等 - 知道它們的名字空間是很好的,特別是在大型項目中 - 所有這些名字都可以在'boost'中定義,在'std'中,在其他一些lib中,或者只是當前項目的本地。 –

1

的選項不必鍵入具有using指令的資格(std::boost::。如果還有其他方法(在這種情況下不存在),它會帶來與using指令相同的問題,所以任何一種方法都會同樣糟糕。

注意using沒有被應用到一個命名空間。你可以,例如,做:

using std::string; 

,然後直接使用string,但是這也並不推薦使用。

+0

確定,僅僅是明確的:只要模板類去,我不得不實行會員函數在頭文件中,然後添加不使用using指令的約束? – Aly

+1

@完全是。對於使用指令沒有任何限制,它只是皺起了眉頭。我只是保留資格。 –

2

您還可以使用的typedef:

typedef std::string string;

它不使用優勢using