【问题标题】:Typedef of a templated alias in C++C++ 中模板化别名的 Typedef
【发布时间】:2017-09-02 19:20:25
【问题描述】:

我有以下模板类A

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

我这样实例化:A&lt;MyStdVector&gt; 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&lt;int&gt;(而不是VectorT&lt;int&gt;)。 更重要的是,我想从另一个类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&lt;int&gt;。 所以我尝试了 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;
}

我对@9​​87654344@ 和alias 之间的区别感到困惑,尤其是当我想混合它们并且它们是模板时...

【问题讨论】:

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


    【解决方案1】:

    类型 3 添加template

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

    【讨论】:

      【解决方案2】:

      澄清您对typedef (C++98) 和别名声明 (C++11) 之间区别的混淆:区别在于模板。

      别名声明可以模板化,而 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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-10
        相关资源
        最近更新 更多