我有以下模板类QCheckBox
:
A
我将其实例化为:template<template<typename>class VectorT>
class A
{
//...
}
其中A<MyStdVector> objectA;
是MyStdVector
的别名,具有特定的分配器(std::vector
):
MyAllocator
我决定在template<typename T>
using MyStdVector = std::vector<T,MyAllocator>
内创建一个名为Vector
的别名:
A
这样我可以在template<template<typename>class VectorT>
class A
{
public:
template<typename T>
using Vector = VectorT<T>;
//...
}
内调用A
(而不是Vector<int>
)。
更重要的是,我想从另一个类VectorT<int>
访问此别名Vector
。 如何实现:
B
以便在类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>
}
中创建属性Vector<int>
。
所以我尝试了3件事(在课堂B
内):
B
但是编译器说明了2个第一个解决方案的类型名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
我对#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
之间的区别感到困惑,特别是当我想要混合它们并且它们是模板化的时候......
答案 0 :(得分:3)
键入3添加template
template <typename T>
using Vector = typename A::template Vector<T>;
答案 1 :(得分:0)
澄清你对typedef
(C ++ 98)和别名声明(C ++ 11)之间区别的困惑:区别在于模板。
别名声明可能会被模板化,而typedef则不能。
使用using
使用用户定义的分配器将myvector声明为向量:
template<typename T>
using myvector = std::vector<T, myAllocator<T>> // alias declaration
myvector<int> myIntVector; // client code
要对typedef
执行相同的操作,您必须在结构模板中嵌套typedef。
template<typename T>
struct myvector {
typedef std::vector<T, myAllocator<T>> type;
}
myvector<int>::type myIntVector; // client code
::type
后缀很麻烦,您使用using
编写较少的样板。这就是为什么你应该更喜欢别名声明为typedef。