skip to Main Content

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


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

    template <Param... Params>
    struct RecursiveType;
    

    See it on godbolt

    Login or Signup to reply.
  2. 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.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search