在C ++中模板化别名的Typedef

时间:2017-04-07 11:58:55

标签: c++ c++11 templates vector alias

我有以下模板类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之间的区别感到困惑,特别是当我想要混合它们并且它们是模板化的时候......

2 个答案:

答案 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。