gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:00:50 24 4
gpt4 key购买 nike

有一个代码示例:

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 ”不是依赖表达式,因此您 不能在那里使用关键字“typename”。简单地写:

using message_ptr = std::shared_ptr<T>;

关于c++ - 模板中定义的类型用于定义类的模板方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33323287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com