【发布时间】:2017-09-02 19:20:25
【问题描述】:
我有以下模板类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;
}
我对@987654344@ 和alias 之间的区别感到困惑,尤其是当我想混合它们并且它们是模板时...
【问题讨论】:
标签: c++ c++11 templates vector alias