在C ++中使用模板化别名的Typedef

我有一个以下模板类A

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

我像这样实例化: A<MyStdVector> objectA; MyStdVector是具有特定分配器( MyAllocator )的std::vector的别名:

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

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

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

      //...
}

这样在A里面我可以调用Vector<int> (而不是VectorT<int> )。 更重要的是,我想从另一个B类访问这个别名Vector如何实现这一点

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> 
}   

例如为了在类B创建一个属性Vector<int> 。 所以我尝试了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 ,它不是一种类型(我猜它只被认为是一个别名而不是一种类型?)为2个第一个解决方案。 最后的解决方案会产生语法错误。

这是我试图编译的整个代码:

#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;
}

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


键入3添加template

template <typename T>
using Vector = typename A::template Vector<T>;
链接地址: http://www.djcxy.com/p/82543.html

上一篇: Typedef of a templated alias in C++

下一篇: Variadic template aliases as template arguments (part 2)