c++ - C++ 中模板化别名的 Typedef

标签 c++ c++11 templates vector alias

我有以下模板类 A :

template<template<typename>class VectorT>
class A
{
      //...
}

我这样实例化:A<MyStdVector> objectA;其中 MyStdVectorstd::vector 的别名使用特定的分配器(MyAllocator):

template<typename T>
using MyStdVector = std::vector<T,MyAllocator>

我决定创建一个名为 Vector 的别名里面A :

template<template<typename>class VectorT>
class A
{
 public:
      template<typename T>
      using Vector = VectorT<T>;

      //...
}

这样里面A我可以打电话Vector<int> (而不是 VectorT<int> )。 更重要的是,我想访问这个别名 Vector来自另一个类(class) B . 如何实现这一目标:

template<class A>
class B
{
public:
    // How to define a type Vector which refers to A::Vector 
    // such that inside B, Vector<int> refers to A::Vector<int>
    // which refers to MyStdVector<int> 
}   

为了创建一个属性Vector<int>在类里面B例如。 所以我尝试了 3 件事(在类 B 内):

typedef typename A::Vector Vector;   //1

template<typename T>
using Vector = typename A::Vector;   //2

template<typename T>
using Vector = typename A::Vector<T> //3

但是编译器说类型名 A::Vector名字 StdVector这不是第一个解决方案的类型(我想它只被视为别名而不是类型?)。最后一个解决方案会产生语法错误。

这是我尝试编译的全部代码:

#include <vector>

template<typename T>
using MyStdVector = std::vector<T/*,MyAllocator*/>;

template<template<typename>class VectorT>
class A
{
public:
    template<typename T>
    using Vector = VectorT<T>;

    //...
};

template<class A>
class B
{
public:
//    typedef typename A::Vector Vector;   // 1

//    template<typename T>
//    using Vector = typename A::Vector;   // 2

//    template<typename T>
//    using Vector = typename A::Vector<T>; // 3

    Vector<int> m_vector;
};

int main(int argc, char *argv[])
{
    A<MyStdVector> a;
    B<A<MyStdVector>> b;
    return 0;
}

我对 typedef 之间的区别感到困惑和 alias ,特别是当我想混合它们并且它们被模板化时......

最佳答案

类型 3 添加一个模板

template <typename T>
using Vector = typename A::template Vector<T>;

关于c++ - C++ 中模板化别名的 Typedef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43277572/

相关文章:

c++ - 对可变参数模板多继承函数调用的访问不明确

c++ - 如何让我的 vector 类支持直接初始化/赋值

c++ - 为什么引用模板参数不推导出 const?

c++ - C++中如何在另一个模板类中使用一个模板类

c++ - 抛出异常时不调用析构函数

c++ - 在使用它的类的构造函数中初始化 std::array 的大小

c++ - 什么类型有多维数组?

c++ - 在 OPENMP 中并行添加矩阵 vector

php - 发送原始字节缓冲区后

c++ - OpenCV vs MATLAB(图像处理的形状测量功能)