我正在將一個靜態庫(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的引用也有點困惑。這是一個嵌套的命名空間,可能是它不按預期工作的原因的一部分?
好的,我假設'使用'設置了一個首選項,而不僅僅是一個快捷方式(因爲在最後或第一個命名空間將有優先權),你說它不會很好地澄清問題。也是,assimp使用math.h – SpliFF 2010-01-03 08:18:03
使用從某個範圍導入某些東西(您可以從一個類中導入一個名稱,當您試圖在後代中重載一個成員函數時特別有用)。如果結果不明確,則在使用歧義時會出現錯誤,這對靜態類型語言來說是一個明智的設計決策。 – AProgrammer 2010-01-03 08:48:41