【问题标题】:Template typedef for std container (without specialization)?标准容器的模板类型定义(没有专门化)?
【发布时间】:2012-04-27 13:44:25
【问题描述】:

是否可以在不专门化的情况下在 std 容器上使用 typedef?

这样的代码可以工作:

typedef std::vector<int> intVector;

但是对于这段代码:

template <typename T>
typedef std::vector<T> DynamicArray<T>;

我收到一个错误:

'typedef'的模板声明

在 C++ 中可以做到这一点吗??

【问题讨论】:

  • 考虑到你基本上所做的只是重命名std::vector,使用#define DynamicArray std::vector会有多无味?
  • @suszterpatt - 是的,但我尽量保持现代并避免使用不安全的宏:)

标签: c++ templates typedef template-specialization specialization


【解决方案1】:

是的,在 C++11 中。

template <typename T>
using DynamicArray = std::vector<T>;

(不是说你应该使用这个确切的别名。)

【讨论】:

  • 它似乎不适用于 Visual Studio 2010 SP1。我得到“无法识别的模板声明/定义”我想它还不被 MS 支持?
  • @ddriver:不,不是。也不是 VC11,AFAIR。如果你想要 C++11,请使用 GCC 或 Clang。
  • 我通过简单地继承向量找到了 VS 的解决方法。如果这不是一个好主意,请参阅我添加的答案并阐明一些观点。谢谢!
【解决方案2】:

如果你的编译器支持 c++11:

template <typename T>
using DynamicArray = std::vector<T>;

否则(c++98 或更早版本)您可以使用如下帮助结构

template<typename T>
struct DynamicArray
{
  typedef std::vector<T> type;
};

然后把它当作

DynamicArray<int>::type my_array;

从 std::vector 继承是一种可能的解决方案,但请注意 STL 容器没有虚拟析构函数。即:

template <typename T>
struct DynamicArray: vector<T> { ... };

int main() {
  vector<int>* p = new DynamicArray<int>();
  delete p; // this is Undefined Behavior
  return 0;
}

【讨论】:

  • 是的,但是当向量在内部对其数据使用动态内存分配时,为什么我要动态分配向量呢?
  • 另外,我不能自己写一个析构函数吗,我认为vector的析构函数应该负责它的数据,我只需要处理我添加的额外内容。我可能错了,我不太擅长 C++。
  • 我的意思是,当然,多态的使用可能存在问题,但由于目的只是使用派生类,我认为由于缺少虚拟析构函数而不会有任何问题。我的意思是,我不会在指向实际上指向 DynamicArray 的向量的指针上调用 delete,它也没有额外的动态分配的成员需要额外注意。如果我错了,请纠正我。谢谢!
  • @ddriver 你是对的,如果你确定你永远不会删除这样的指针,你就很好。
  • 如果我从一个向量指针中删除,如果我的派生类中没有任何额外的成员,这意味着什么?
【解决方案3】:

此语法在 C++ 中无效,没有像“模板类型定义”这样的功能。

template <typename T>
typedef std::vector<T> DynamicArray<T>;

但是,C++11 引入了一个模板别名语法,几乎是这样的:

template <typename T>
using DynamicArray =  std::vector<T>;

在 C++03 中,您可以使用如下模板元函数:

template<class T>
struct DynamicArray
{
    typedef std::vector<T> type;
};

【讨论】:

    【解决方案4】:

    常见的解决方案(如果您不使用 C++ 11)是这样做:

    template<class T>
    struct DynamicArray
    {
        typedef std::vector<T> Type;
    };
    

    并将其用作DynamicArray&lt;Something&gt;::Type

    【讨论】:

      猜你喜欢
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 2014-05-13
      相关资源
      最近更新 更多