7

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

像这样的代码有效:

typedef std::vector<int> intVector;

但是对于这段代码:

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

我收到一个错误:

'typedef' 的模板声明

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

4

4 回答 4

11

是的,在 C++11 中。

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

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

于 2012-04-27T13:48:24.870 回答
6

如果您的编译器支持 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 容器没有虚拟析构函数。IE:

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

int main() {
  vector<int>* p = new DynamicArray<int>();
  delete p; // this is Undefined Behavior
  return 0;
}
于 2012-04-27T13:48:28.037 回答
3

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

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;
};
于 2012-04-27T13:50:57.483 回答
2

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

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

并将其用作DynamicArray<Something>::Type.

于 2012-04-27T13:48:18.390 回答