簡體   English   中英

模板中定義的類型用於定義類的模板方法

[英]Type defined in template use to define template method of the class

有一個代碼示例:

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嗎?

當您編寫“ MT :: message_ptr”時,實際上是在編寫一個表達式,該表達式取決於參數模板(MT)的定義:稱為依賴表達式。

然后,編譯器的問題是知道“ message_ptr”是類型名稱還是其他名稱(函數,變量...)。 為了解決這個問題,標准要求類型名稱的任何相關表達式都以關鍵字... typename :-)作為前綴。

因此,這是您的成員函數模板的正確定義:

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

編輯

順便說一句,“ std :: shared_ptr <T>”不是從屬表達式,因此您不得在此處使用關鍵字“ typename”。 只需寫:

using message_ptr = std::shared_ptr<T>;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM