推 lausai:神人 大感謝! 02/26 14:34
※ 引述《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)