2010-01-03 101 views
1

我正在將一個靜態庫(assimp)合併到現有項目(Spring RTS)中,其中庫和項目都在正常開發中。我試圖以這樣一種方式添加庫,以便在發佈新版本時輕鬆地重複整合。用命名空間解決C++中的模糊調用

無論如何,問題在於Spring需要庫使用streflop數學庫來執行所有的數學運算。在實踐中,這意味着min(x,y)在任何地方都應該用streflop::min(x,y)代替(這是很多的,考慮到這個問題適用於所有的數學函數)。

我可以做一個大規模的正則表達式替換,但我希望有一些更優雅的東西。經過一些研究和測試後,似乎在每個.cpp文件的頂部添加using namespace streflop;就可以實現,但事實並非如此。

確切的錯誤是:

/mnt/work/workspace/spring-patch-git/spring/rts/lib/assimp/code/FixNormalsStep.cpp:147: error: call of overloaded sqrtf(const float&) is ambiguous 
/usr/include/bits/mathcalls.h:157: note: candidates are: float sqrtf(float) 
/mnt/work/workspace/spring-patch-git/spring/rts/lib/streflop/SMath.h:347: note:     streflop::Simple streflop::sqrtf(streflop::Simple) 

我以爲命名空間的整點是爲了解決這樣的事情,但它似乎並沒有在這裏工作。我對streflop :: Simple的引用也有點困惑。這是一個嵌套的命名空間,可能是它不按預期工作的原因的一部分?

回答

7

如果您只需要從streflop命名空間min功能,您可以使用

using streflop::min; 

代替

using namespace streflop; 

這將只導入名稱min,而不是整個命名空間。

你的錯誤是因爲你在做什麼從streflop命名空間導入每個名字,這樣它們可以被使用不合格,並且sqrtf已經存在不合格。你可能包含C頭文件,因爲它們在C中?那就是用math.h代替cmath?因爲如果使用類似cmath的C++頭文件,標準庫中的函數將位於std名稱空間中,即使導入了整個streflop名稱空間,也不應該發生衝突。

另一種選擇是,如果您現在從中獲得錯誤的地方很少,您可以明確限定它們。就像在這種情況下一樣,您可以將sqrtf替換爲streflop::sqrtf::sqrtf,具體取決於您要使用的版本。

streflop::Simple與您的問題無關;它只是streflop::sqrtf的參數類型和返回值。它涉及的唯一方法是在重載分辨率下,它被視爲float,因此列出的sqrtf函數都可以調用,編譯器無法確定您的意思。

+0

好的,我假設'使用'設置了一個首選項,而不僅僅是一個快捷方式(因爲在最後或第一個命名空間將有優先權),你說它不會很好地澄清問題。也是,assimp使用math.h – SpliFF 2010-01-03 08:18:03

+0

使用從某個範圍導入某些東西(您可以從一個類中導入一個名稱,當您試圖在後代中重載一個成員函數時特別有用)。如果結果不明確,則在使用歧義時會出現錯誤,這對靜態類型語言來說是一個明智的設計決策。 – AProgrammer 2010-01-03 08:48:41