是否可以在不专门化的情况下在 std 容器上使用 typedef?
像这样的代码有效:
typedef std::vector<int> intVector;
但是对于这段代码:
template <typename T>
typedef std::vector<T> DynamicArray<T>;
我收到一个错误:
'typedef' 的模板声明
在 C++ 中可以做到这一点??
是否可以在不专门化的情况下在 std 容器上使用 typedef?
像这样的代码有效:
typedef std::vector<int> intVector;
但是对于这段代码:
template <typename T>
typedef std::vector<T> DynamicArray<T>;
我收到一个错误:
'typedef' 的模板声明
在 C++ 中可以做到这一点??
是的,在 C++11 中。
template <typename T>
using DynamicArray = std::vector<T>;
(并不是说您应该使用这个确切的别名。)
如果您的编译器支持 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;
}
此语法在 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;
};
常见的解决方案(如果您不使用 C++ 11)是这样做的:
template<class T>
struct DynamicArray
{
typedef std::vector<T> Type;
};
并将其用作DynamicArray<Something>::Type
.