error C3856: 'RecursiveType': symbol is not a class template

117 views Asked by At

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

There are 2 answers

4
Caleth On BEST ANSWER

You are missing a primary template. Both of your definitions are specializations.

template <Param... Params>
struct RecursiveType;

See it on godbolt

0
Weijun Zhou On

You are missing the declaration for the primary template. The syntax you use are for specializations.

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 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 that RecursiveType is a template that takes arbitrary numbers of template parameters, and each parameter must be of type Param. Without the declaration, the compiler has no idea what the name refers to.

Quote from the standard about explicit specialization

An explicit specialization does not introduce a name ([basic.scope.scope]). A declaration of a function template, class template, or variable template being explicitly specialized shall be reachable from the declaration of the explicit specialization.