我无法在同一个模板中使用模板名称。我想像下面一样使用它。但是它给了我错误。这是代码;
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
}
};
答案 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
。
此示例中有两件事由不同的编译器处理不同。
Typer
作为模板。 gcc呢,铿锵没有。它看起来像是VC ++和clang中的一个bug。 (更新:这确实是clang bug #9551)。说14.6.1 / 1:
与普通(非模板)类一样,类模板具有注入类名(第9节)。注入的类名可以用作模板名或类型名。当它与template-argument-list一起使用时,作为模板模板参数的模板参数,或者作为友元类模板声明的详细类型说明符中的最终标识符,它指的是类模板本身。