C ++模板自身名称作为模板模板参数传递到同一模板结构函数内部

时间:2014-07-31 05:56:42

标签: c++ templates c++11 variadic-templates

我无法在同一个模板中使用模板名称。我想像下面一样使用它。但是它给了我错误。这是代码;

   template <unsigned int N, template <class...> class ClassName, class ... InsideClass> struct GetNthTypeOfNested;
    template<unsigned int N, template<class...> class ClassName, class FirstOfInsideClass, class ... RestOfInsideClass>
    struct GetNthTypeOfNested<N, ClassName, FirstOfInsideClass, RestOfInsideClass...>:GetNthTypeOfNested<N - 1, ClassName, RestOfInsideClass...>{};
    template<template<class...> class ClassName, class ... InsideClass>
    struct GetNthTypeOfNested<0, ClassName, InsideClass...>{
        typedef typename ClassName<InsideClass...> type;
    };

    template<typename ... Args> struct Typer;
    template<>
    struct Typer<>{

    };
    template<typename First,typename ... Args>
    struct Typer<First,Args...>:Typer<Args...>{
        template<unsigned int N>
        void get(){
            cout << typeid(typename GetNthTypeOfNested<N, Typer, First, Args...>::type).name();
//Typer undefined here i cant use Typer but i can use Typer outside of function
        }
    };

1 个答案:

答案 0 :(得分:0)

(由于误读,以前的版本不正确)

你有一个模糊的模板实例化。

将您的GetNthTypeOfNested<0,...>专精更改为

template<template<class...> class ClassName, 
         class FirstOfInsideClass,                              // <- change here
         class ... InsideClass>
struct GetNthTypeOfNested<0, 
                          ClassName, 
                          FirstOfInsideClass,                   // <- and here
                          InsideClass...>
{
    typedef ClassName<FirstOfInsideClass, InsideClass...> type; // <- and here
};

由于VC ++错误,请将Typer替换为::Typer内的Typer

Demo

此示例中有两件事由不同的编译器处理不同。

  1. VC ++不会将模板特化识别为含糊不清。 gcc和clang都这样做。这可能是VC ++错误。
  2. VC ++无法识别没有模板参数的Typer作为模板。 gcc呢,铿锵没有。它看起来像是VC ++和clang中的一个bug。 (更新:这确实是clang bug #9551)。
  3. 说14.6.1 / 1:

      

    与普通(非模板)类一样,类模板具有注入类名(第9节)。注入的类名可以用作模板名或类型名。当它与template-argument-list一起使用时,作为模板模板参数的模板参数,或者作为友元类模板声明的详细类型说明符中的最终标识符,它指的是类模板本身。