在C ++中使用模板化别名的Typedef
我有一个以下模板类A
:
template<template<typename>class VectorT>
class A
{
//...
}
我像这样实例化: A<MyStdVector> 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<int>
(而不是VectorT<int>
)。 更重要的是,我想从另一个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<int>
。 所以我尝试了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;
}
我对typedef
和alias
之间的区别感到困惑,特别是当我想混合它们并且它们被模板化时...
键入3添加template
template <typename T>
using Vector = typename A::template Vector<T>;
链接地址: http://www.djcxy.com/p/82543.html
上一篇: Typedef of a templated alias in C++
下一篇: Variadic template aliases as template arguments (part 2)