看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《lausai (恨怨悲苦憎怒嗔)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : linux g++ 4.4.3 : 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) : 問題(Question): : 只是純粹對template的研究 偶然發現這樣的code編譯不會過 : 錯誤訊息 : error: template argument 1 is invalid : error: expected unqualified-id before ‘>’ token : 後來又發現在 outer 裡面加上 typedef 那一行 : 然後用 version 2 的 getInner 編譯就過了 : 不過基於好奇還是想知道為什麼 version 1 的 getInner 編不過 : 有神人知道為什麼嗎?? : 餵入的資料(Input): : 預期的正確結果(Expected Output): : 錯誤結果(Wrong Output): : 程式碼(Code):(請善用置底文網頁, 記得排版) : template <typename T> : class wapper { : }; : template <typename T> : class outer { : public: : template <typename V> : class inner { : }; : //typedef inner<T> Inner; : wapper<inner<T> > getInner(); : }; : // version 1 : template <typename T> : wapper<typename outer<T>::inner<T> > outer<T>::getInner() : { : return inner<T>(); : } : // version 2 : #if 0 : template <typename T> : wapper<typename outer<T>::Inner> outer<T>::getInner() : { : return inner<T>(); : } : #endif : int main() : { : return 0; : } : 補充說明(Supplement): 參考 ISO/IEC 14882:1998(E) 這裡需要一個 qualified-id, 下面是語法分析過程會用到的規則 (用白色表示) qualified-id: :: nested-name-specifier template unqualified-id :: identifier :: operator-function-id :: template-id nested-name-specifier: class-or-namespace-name :: nested-name-specifier (*) class-or-namespace-name :: template nested-name-specifier 第一個 scope resolution operator 可有可無, 而後面如果又接:: (如*所示), 此時就要明白指出 ::後面的識別項是或不是模板型態, 當然若是模板型態最前面的 typename 也是不可少的. 修改後的程式碼: http://codepad.org/Bi2rWV2Y -- ◢████ ◢█ ◢██◣ ◢█ ◢███ ◢█ T-ara版怎麼去 ████◢█████s ~> T-ara ███ █ ◢██ 歡迎您的光臨 ███████████恩靜智妍孝敏 ███ ██ 素妍居麗寶藍 ████◥██◤ █████花英 ψmakigoto123 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115 ※ 編輯: loveme00835 來自: 140.121.197.115 (02/26 05:25)
lausai:神人 大感謝! 02/26 14:34