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

Type defined in template use to define template method of the class

本文关键字:定义 模板方法 用于 类型      更新时间:2023-10-16

下面是代码示例:

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类是正确的吗?可以在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"不是依赖表达式,因此不能在中使用关键字"typename"。简单地写:
using message_ptr = std::shared_ptr<T>;