如何在不声明类型的情况下将模板发送到另一个模板?

时间:2014-06-05 14:34:33

标签: c++ templates c++11 using

我正在尝试编译以下代码:

#include <iostream>

template<class T> struct Container1;//forward declaration
template<class T> struct Container2;//forward declaration

template<class Container,class Type>
using _Make_Container=typename Container<Type>;

template<class T>
struct Container1
{};

template<class T>
struct Container2
{};

int main()
{
    _Make_Container<Container1,int> a;
}

这给了我一些错误:

 expected nested-name-specifier before 'Container'
  using _Make_Container=typename Container<Type>;
                                ^
 error: 'Container' is not a template

我似乎没问题,因为我们将Container1int发送给using然后它变为:

using _Make_Container=typename Container1<int>;
//then 
Container1<int> a;

我无法理解错误的原因!!有什么想法吗?

有没有办法让它有效?

3 个答案:

答案 0 :(得分:3)

这些错误消息非常清楚。

  

在'Container'之前的预期嵌套名称说明符

 using _Make_Container=typename Container<Type>;
                          ^

您不是指嵌套的依赖类型,因此此处不需要typename关键字。请阅读this,详细说明需要typename的位置。

  

错误:'容器'不是模板

就像它说的那样,你的别名模板并不表示Container是一个模板,但它继续将它作为一个模板使用。您需要为Container

使用模板模板参数
template<template<typename> class Container,class Type>
using _Make_Container = Container<Type>;

借用Yakk的excellent suggestion,您应该将别名模板定义更改为

template<template <typename...> class T1, typename... T2>
using Make_Container = T1<T2...>;

这可以让您执行以下操作:

template<class T, class T1>
struct Container2
{};

Make_Container<Container2,int,long> b;

最后,实现中使用前导下划线后跟大写字母的名称为reserved。因此,您应该将_Make_Container重命名为Make_Container

答案 1 :(得分:2)

您必须编写像this

这样的别名模板
template<template <typename> class T1,class T2>
using _Make_Container= T1<T2>;

答案 2 :(得分:1)

template< template <class> class Container,class Type>
using _Make_Container = Container<Type>;