I am trying to create type with recursive template like std::tuple
, unfortunately it does not compile, however I did it seemingly same way as in tuple
source code. I am compiling with Visual Studio 2022 with -std:c++latest
and getting error error C3856: 'RecursiveType': symbol is not a class template
.
Here is minimal example:
struct Param {
};
template <>
struct RecursiveType<> { // empty base case
};
template <Param T, Param... Rest>
struct RecursiveType<T, Rest...> : public RecursiveType<Rest...> { // recursive type definition
};
2
Answers
You are missing a primary template. Both of your definitions are specializations.
See it on godbolt
You are missing the declaration for the primary template. The syntax you use are for specializations.
RecursiveType
is a name. Before usage of any names, a declaration must be made to tell the compiler what it is. In this particular case, the declaration tells the compiler thatRecursiveType
is a template that takes arbitrary numbers of template parameters, and each parameter must be of typeParam
. Without the declaration, the compiler has no idea what the name refers to.Quote from the standard about explicit specialization