2010-05-21 49 views
1

我正在移植一些來自Windows的模板代碼,我在iPhone 3.2 SDK上遇到了一些編譯器差異。類模板的成員函數內部iPhone SDK 3.2上的模板編譯錯誤

原始代碼是:

return BinarySearch<uint32, CSimpleKey<T> >(key); 

其中BinarySearch的是從另一模板繼承的方法。

這將產生以下錯誤:

csimplekeytable.h:131: error: no matching function for call to 'BinarySearch(NEngine::uint32&)' 

在Visual Studio編譯器似乎走到模板層次不錯,但GCC需要我完全限定在函數來自(我已經通過固定同樣驗證了這一點問題與模板成員變量的方式)。

所以我現在需要改變成這樣:

return CSimpleTable<CSimpleKey<T> >::BinarySearch<uint32, CSimpleKey<T> >(key); 

現在產生以下錯誤:

csimplekeytable.h:132: error: expected primary-expression before ',' token 
csimplekeytable.h:132: error: expected primary-expression before '>' token 

有些撓頭之後,我相信這是怎麼回事就在於它的努力在BinarySearch出於某種原因作爲「小於」運算符之前解決'<'。

所以有兩個問題: - 我在正確的道路上解釋我的錯誤嗎? - 我該如何解決?

-D

回答

0

如果CSimpleTable是基類,則需要使用該基類名稱或this限定呼叫。但是,由於這兩者都依賴於模板參數,因此編譯器無法查找名稱BinarySearch的含義。它可以是一個靜態的整數常量,你可以將它與其他的東西進行比較,或者它可以是一個模板,你可以將參數放在<...>中。你需要告訴編譯器有關,後者

/* the "::template" means: 'the name that follows is a template' */ 
return CSimpleTable<CSimpleKey<T> >::template BinarySearch<uint32, CSimpleKey<T> >(key); 

或用this

return this->template BinarySearch<uint32, CSimpleKey<T> >(key); 

的原因資格是編譯器不查找在基類依賴於模板參數不合格的名稱(在你的情況下,參數是T),因爲名字的綁定取決於基類是否有這樣一個名字,這被認爲是不幸的。對於像BinarySearch這樣的普通名稱,除此之外沒有任何跡象表明該名稱取決於模板參數,因此標準要求編譯器在實例化之前不要延遲查找名稱。所以這個名字,即使在依賴基礎上查找將被允許在實例化(不是)上,也無法找到。

您必須明確告訴編譯器通過限定它來查找封閉類,在這種情況下,編譯器在實例化時將在查找過程中包含從屬基類。前綴this或類名稱也將使名稱依賴於,從而延遲查找直到實例化。這兩個事實是它工作所必需的。

+0

是的! 「this->」起作用,因爲你解釋的原因是一種更明顯的選擇。衛生署! 謝謝! – 2010-05-21 23:10:25

0

也許它只是一個與uint32 typedef的問題。這可能是因爲它在新環境中不可用。在第一種情況下,命名空間解析拾取NEngine :: uint32,在第二種情況下,它根本沒有選擇任何東西(因此解析錯誤)。

我建議尋找如何在Windows上定義uint32,並嘗試複製該定義。

-1

也許是因爲你讓你的間距不一致。您已完成,而不是CSimpleTable<CSimpleKey<T>>。我相信它們都應該是有效的,但也許有一個解析器錯誤。

編輯:您也可以嘗試向下自動參數類型演繹路線,並斬波顯式專業化。

+0

第二個是無效的,因爲它被解釋爲轉移標記。這就是爲什麼這個空間在那裏,這迫使它被解釋爲兩個連續的'>'代幣。 – 2010-05-21 18:59:00