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

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

最佳答案

当您编写“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/

相关文章:

c# - 如何在 C# 中获得更多封装?

c++ - 带有静态库的 Android Studio 中的 native C++ 代码

c++ - 继承的运算符重载不适用于派生类

python bottle framework - 如何将字典传递给嵌套模板?

c++ - 显示 n 皇后问题的多个可能答案

c++ - 如何将 StretchDIBits 的原点设置为左上角?

python - 如何在Python中根据子类类型定义基类参数?

c++ - 类和成员函数(初学者)

Android 传递值给类

javascript - 如何使用 Hogan.JS 从外部文件加载模板?