2011-12-23 87 views
3

我想知道是否可以在頭文件中定義一些函數,然後在同一個頭文件中使用它們,同時將它們從其他東西中隱藏起來?例如,我可以先定義一些通用的幫助函數(特定於數據結構),然後在使用這些函數的相同頭文件中定義一些數據結構?在頭文件中隱藏非成員函數

如:

template<class T> 
void Swap(T &a, T &b) 
{ 
    T temp = a; 
    a = b; 
    b = temp; 
} 

但我不想Swap()與具有相同名稱的其他功能干擾。

我可以讓它變成一個私有方法,但後來我不得不提供具有相同實現使用它的每一個類或讓他們的朋友類...

+2

關於交換干擾其他交換功能,這就是爲什麼命名空間被髮明,使用它們!據我所知,你只能通過將它們隱藏在類或結構中來隱藏頭文件中的函數。你可以使用這個函數作爲一個私有結構,並指定你正在創建的類作爲一個朋友類。 – leetNightshade 2011-12-23 21:45:58

回答

5

您通常不能從其他客戶端完全隱藏該功能,但可以將其放在其自己的名稱空間中,以便它不會干擾客戶端代碼。通常的做法是使命名空間成爲主庫命名空間的內部命名空間,並稱其爲details或類似的東西。

當然,如果您需要通過ADL提供功能,那麼它將有生活在封裝了ADL應該匹配的類的命名空間中。這是沒有辦法的。

6

傳統,命名空間details用於實施保留的東西必須放在標題中。

此外,還有一個std::swap,所以不需要你自己的。