C++中模板别名的typedef

3

我有一个模板类A,如下所示:

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

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

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>,我尝试了三件事(在类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

但是编译器说,typename 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;
}

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

2个回答

3

第三种方式:添加一个模板

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

0
为了澄清你对于 typedef (C++98) 和 alias declaration (C++11) 之间差异的困惑:区别在于模板。 alias declaration 可以被模板化,而 typedef 不能。 使用 using 来声明 myvector 作为一个使用用户自定义分配器的向量:
template<typename T>
using myvector = std::vector<T, myAllocator<T>>  // alias declaration

myvector<int> myIntVector; // client code

如果要使用typedef完成相同的操作,你需要将typedef嵌套在一个结构模板内部。

template<typename T>
struct myvector {
    typedef std::vector<T, myAllocator<T>> type;
}

myvector<int>::type myIntVector; // client code

::type 后缀很麻烦,而使用 using 可以减少样板代码。这就是为什么你应该优先选择别名声明而不是 typedef。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接