模板中定义的类型用于定义类的模板方法

时间:2015-10-24 20:59:17

标签: c++ class templates

有一个代码示例:

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

1 个答案:

答案 0 :(得分:1)

当您编写“MT :: message_ptr”时,您实际上编写的表达式取决于参数模板(MT)的定义:这称为依赖表达式。

编译器的问题是要知道“message_ptr”是类型名称还是其他名称(函数,变量......)。要解决此问题,标准要求类型名称的任何依赖表达式都以关键字... typename 为前缀: - )

所以这是您的成员函数模板的正确定义:

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

修改

BTW,“std :: shared_ptr&lt; T&gt;”不是依赖表达式,因此不得在那里使用关键字“typename”。只需写下:

using message_ptr = std::shared_ptr<T>;