Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;_C++_Templates - Fatal编程技术网

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);