有一个代码示例:
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吗?
答案 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>;