有一个代码示例:
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
using message_ptr = std::shared_ptr<T>;
关于c++ - 模板中定义的类型用于定义类的模板方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33323287/