我正在尝试使用像
std::tuple
这样的递归模板创建类型,不幸的是它无法编译,但是我的做法似乎与tuple
源代码中的方式相同。我正在使用 Visual Studio 2022 进行编译,并使用 -std:c++latest
并收到错误 error C3856: 'RecursiveType': symbol is not a class template
。
这是一个最小的例子:
struct Param {
};
template <>
struct RecursiveType<> { // empty base case
};
template <Param T, Param... Rest>
struct RecursiveType<T, Rest...> : public RecursiveType<Rest...> { // recursive type definition
};
您缺少主模板的声明。您使用的语法是专门化的。
struct Param {
};
template <Param...>
struct RecursiveType; //The primary template must be declared
template <>
struct RecursiveType<> { // empty base case
};
template <Param T, Param... Rest>
struct RecursiveType<T, Rest...> : public RecursiveType<Rest...> { // recursive type definition
};
RecursiveType
是一个名字。在使用任何名称之前,必须进行声明以告诉编译器它是什么。在这种特殊情况下,声明告诉编译器 RecursiveType
是一个采用任意数量的模板参数的模板,并且每个参数的类型必须是 Param
。如果没有声明,编译器不知道该名称指的是什么。
显式专业化不会引入名称([basic.scope.scope])。显式特化的函数模板、类模板或变量模板的声明应可从显式特化的声明中访问。