2010-07-13 140 views
2

我有這樣一個標題:命名空間相同的名稱,功能

double commonFunction(...) 
{ /*...*/ } 
namespace F2 
{ 
    double impactFactor(...) 
    { /*...*/ } 
    double func(...) 
    { /*...*/ } 
    double F2(...) 
    { /*...*/ } 
} 
namespace FL 
{ 
    double impactFactor(...) 
    { /*...*/ } 
    double func(...) 
    { /*...*/ } 
    double FL(...) 
    { /*...*/ } 
} 

而且我想從全局命名空間訪問F2和F1功能。我嘗試添加這頭結束(或之後包括,無所謂):

using F2::F2; 
using FL::FL; 

我敢肯定,這個工程時,函數名從命名空間中的名稱不同,但爲什麼會出現這種不工作,我該如何解決它?謝謝

PS:我不能把這些函數放在他們的命名空間之外,因爲這會導致一個重新定義的符號(F2和FL,作爲命名空間和函數)。

UPDATE:對於那些詛咒我的人,這就是我所做的。由於這是一個科學公式頭文件,並且很難找到一個好的短名稱空間名稱,所以命名空間爲F2和FL,函數本身爲f2和fL。

+1

通過使用適當的名稱解決這個問題。 IME最好的命名空間名稱是名詞,最好的功能名稱是動詞。用英語,這仍然有衝突的餘地,但他們少得多。 – sbi 2010-07-13 08:24:21

+0

*使用*將名稱帶入作用域,因此如果在當前作用域中有該名稱的任何內容,編譯器將會發出抱怨。 所以,這意味着如果您在當前上下文中定義名稱** F2 **的** int **,那麼將您的名稱空間名稱更改爲** F_INFINITE **將導致相同的錯誤。 – 2010-07-13 09:16:21

+0

這與名稱空間和函數名稱是相同的名稱無關,只是它們的聲明恰好在相同的範圍內。 – 2010-07-13 09:18:12

回答

5

因爲,using將帶有給定名稱的每個聲明都帶入範圍,所以如果您已經有兩個或更多具有一個名稱的聲明(在這種情況下爲namespace f1),它會發出抱怨。

它與名稱空間和函數的名稱沒有任何關係。 即使這樣也產生了同樣的錯誤:

namespace foo 
{ 
    void not_foo(){}; 
} 
namespace not_foo 
{ 
    void foo(){} 
} 
using not_foo::foo; 
+0

這是更正確的。 – rubenvb 2010-07-13 09:18:29

1

你的問題是「如何從全局命名空間訪問F2和FL功能」。

這有點含糊不清,因爲它可以解釋爲「如何訪問在全局命名空間中定義的F2和FL函數」。但從代碼中,我認爲你的意思是「如何從全局命名空間中的代碼訪問:: F2 :: F2和:: FL :: FL函數」

我想知道你遇到了什麼錯誤。另外,什麼是實際的論點?沒有這個,我只能猜測。我建議將using聲明更改爲using ::FL::FL。儘管如此,在全局名稱空間中查找FL的名稱將會找到namespace FL,您無法隱藏該名稱。

+0

'錯誤C2882:'F2':非法使用表達式中的名稱空間標識符 – Gunslinger47 2010-07-13 08:35:28

+0

嗨@MSalter,您可以查看我的答案,我有低代表,我需要有經驗的人看看它,請節省幾秒鐘。謝謝。 – 2010-07-13 09:02:17

+0

好的和簡潔的答案,一個明顯的例子。 – MSalters 2010-07-13 09:55:45

相關問題