3

I'm trying to compile following code :

#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;
}

Which give me some errors:

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

It seems OK to me because we send Container1 and int to using Then it becomes :

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

I can't understand the reason for that errors !! Any idea?

Is there any way for making that works ?

uchar
  • 2,552
  • 4
  • 29
  • 50

3 Answers3

3

Those error messages are pretty clear.

expected nested-name-specifier before 'Container'

 using _Make_Container=typename Container<Type>;
                          ^

You're not referring to a nested dependent type so there's no need for the typename keyword here. Read this for a detailed explanation on where typename is required.

error: 'Container' is not a template

Just like it says, your alias template doesn't indicate Container is a template, but then it proceeds to use it as one. You need to use a template template parameter for Container

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

And borrowing Yakk's excellent suggestion, you should change the alias template definition to

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

This lets you do the following:

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

Make_Container<Container2,int,long> b;

Finally, names using a leading underscore followed by an upper case letter are reserved by the implementation. So you should rename _Make_Container to Make_Container.

Community
  • 1
  • 1
Praetorian
  • 106,671
  • 19
  • 240
  • 328
2

You have to write the alias template like this

template<template <typename> class T1,class T2>
using _Make_Container= T1<T2>;
Nikos Athanasiou
  • 29,616
  • 15
  • 87
  • 153
1
template< template <class> class Container,class Type>
using _Make_Container = Container<Type>;