我正在尝试编译以下代码:
#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
我似乎没问题,因为我们将Container1
和int
发送给using
然后它变为:
using _Make_Container=typename Container1<int>;
//then
Container1<int> a;
我无法理解错误的原因!!有什么想法吗?
有没有办法让它有效?
答案 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>;