2015-10-24 57 views
0

有代碼的一個示例的模板的方法:用於定義類

template <class T> 
class CMessage 
    { 
    public: 
     using message_ptr = typename std::shared_ptr<T>; 
     static message_ptr Create (T val) 
      { 
      return std::make_shared<T>(val); 
      } 
    }; 

class CBuilder 
    { 
    public: 
     template <typename MT> MT::message_ptr CreateMessage() 
      { 
      return MT::message_ptr(); 
      } 
    }; 

CBuilder builder; 
CMessage<int>::message_ptr msg = builder.CreateMessage<CMessage<int>>(); 

的CBuilder clsss是正確的?可以在CBuilder中使用MT :: message_ptr?

+0

_「CBuilder clsss是否正確?」_你的編譯器的意見是什麼? –

+0

如果你在'MT :: message_ptr'之前加上'typename',它就可以建立:https://ideone.com/gQHPHu –

+1

請更清楚地描述你的問題。是否有編譯器錯誤?如果是這樣,請包括它。 – Yakk

回答

1

當你編寫「MT :: message_ptr」時,你實際上寫了一個表達式,這個表達式取決於你的參數模板(MT)的定義:這就是所謂的依賴表達式。

然後,編譯器的問題是要知道「message_ptr」是類型名稱還是別的名稱(函數,變量...)。爲了解決這個問題,該標準要求的類型名的任何依賴性表達通過關鍵字... 類型名稱 :-)

因此,這裏是你的成員函數模板的正確定義前綴:

template <typename MT> 
typename MT::message_ptr CreateMessage() 
{ 
    return typename MT::message_ptr(); 
} 

編輯

BTW 「的std :: shared_ptr的<牛逼>」 不是依賴性表達,所以你不得使用關鍵字 「類型名」 那裏。簡單地寫:

using message_ptr = std::shared_ptr<T>;