C++ 在C++;
我试图将一个内部模板类(常规类的)传递给另一个接受模板作为参数的类 接受模板的类是:C++ 在C++;,c++,templates,C++,Templates,我试图将一个内部模板类(常规类的)传递给另一个接受模板作为参数的类 接受模板的类是: template <typename... T> struct TypeList { template <template <typename...> typename P> using Apply = P<T...>; }; 不起作用 我的编译器抱怨 错误:在没有参数列表的情况下,模板名称“Outer::Inner”的使用无效 如果我使用Flat=Oute
template <typename... T> struct TypeList {
template <template <typename...> typename P> using Apply = P<T...>;
};
不起作用
我的编译器抱怨
错误:在没有参数列表的情况下,模板名称“Outer::Inner”的使用无效
如果我使用Flat=Outer::internal使用template“展平”内部模板类,它就会工作代码>
我的问题是,有没有一种方法可以使内部模板类工作,而不需要对其进行别名和展平?我是否缺少typename
或template
关键字
完整的例子是:
#include <tuple>
#include <type_traits>
template <typename... T> struct TypeList {
template <template <typename...> typename P> using Apply = P<T...>;
};
struct Outer {
template <typename... P> struct Inner {};
};
template <typename... P> using Flat = Outer::Inner<P...>;
int main() {
using List = TypeList<int, float, double>;
static_assert(std::is_same<List::template Apply<std::tuple>,
std::tuple<int, float, double>>::value);
static_assert(std::is_same<List::template Apply<Flat>,
Outer::Inner<int, float, double>>::value);
static_assert(std::is_same<List::template Apply<typename Outer::Inner>,
Outer::Inner<int, float, double>>::value);
}
#包括
#包括
模板结构类型列表{
模板使用Apply=P;
};
结构外部{
模板结构内部{};
};
模板使用平面=外部::内部;
int main(){
使用列表=类型列表;
静态断言(std::is\u same::value);
静态断言(std::is\u same::value);
静态断言(std::is\u same::value);
}
类型名Outer::internal
是错误的,因为internal
不是类型而是模板
您甚至可以在此处删除所有typename/template,因为不存在依赖类型问题
static_assert(std::is_same<List::Apply<Outer::Inner>,
Outer::Inner<int, float, double>>::value);
static_断言(std::is_same::value);
在从属上下文中,它将是
// template <typename OuterT> /*..*/
static_assert(std::is_same<List::Apply<OuterT::template Inner>,
typename OuterT::template Inner<int, float, double>>::value);
//模板//**/
静态断言(std::is\u same::value);
前面你说的不正确。你能解释一下怎么做吗?去掉typename
关键字使所有3个断言都通过并编译。@0x499602D2抱歉,您的解决方案是正确的。但是我有一个稍微复杂一点的例子,编译器在我的代码中给出了同样的错误。更严格的解决方案是指定Outer::template internal
,这使编译器感到满意。我相信我有一个忠实的复制,但删除所有的typename/template并没有做到这一点。但是,当我遵循依赖上下文的解决方案时,这一切都起到了作用(即,对于模板与类型名的关系非常明确)
static_assert(std::is_same<List::Apply<Outer::Inner>,
Outer::Inner<int, float, double>>::value);
// template <typename OuterT> /*..*/
static_assert(std::is_same<List::Apply<OuterT::template Inner>,
typename OuterT::template Inner<int, float, double>>::value);