标准容器的模板类型定义(无专用化)
Template typedef for std container (without specialization)?
是否可以在 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 容器没有虚拟析构函数,即:
template <typename T>
struct DynamicArray: vector<T> { ... };
int main() {
vector<int>* p = new DynamicArray<int>();
delete p; // this is Undefined Behavior
return 0;
}
此语法在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;
};
常见的解决方案(如果您不使用C++ 11)是执行以下操作:
template<class T>
struct DynamicArray
{
typedef std::vector<T> Type;
};
并将其用作DynamicArray<Something>::Type
.
相关文章:
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- C++模板专用化 - 无法匹配函数定义
- 如何使用 STL 排序对具有模板专用化的自定义类对象进行排序?
- 为什么模板专用化需要内联定义?
- 模板专用化会导致未定义的引用错误
- 对专用模板成员的未定义引用
- 在模板类内部定义的枚举上的嵌套类的部分专用化
- 没有针对完全专用模板类的外联虚拟方法定义
- 使用模板模板参数进行模板定义的函数专用化
- 如何从具有专用化的类模板定义静态成员变量?
- 如何为模板化类的模板化函数定义模板专用化
- C++模板专用化成员函数的定义
- 仅为某些模板专用化定义转换运算符:预期类型/预期类型说明符
- 如何在另一个类模板中定义完全专用类的构造函数
- C++跨文件共享的模板专用化定义
- 如何专用/分配自定义内存位置,以便可以在C 中编辑该位置
- 元组的定义和初始化,其组件属于同一模板化类,但具有不同的专用化
- 在子类中定义可变参数函数专用化
- 为类模板的单个成员定义专用化
- UE4自定义专用服务器(碰撞,命中框)