0

I'm trying to compile in GCC 4.8.5 (x86_64-suse-Linux) an example of enumeration in C++:

http://www.drdobbs.com/when-enum-just-isnt-enough-enumeration-c/184403955?pgno=1 (see code below)

But I get an error:

Test_Enum_String.cpp:5:1: error: specializing member ‘Tmpl_Enum<std::basic_string<char>, Test_Enum_String>::s_instances’ requires ‘template<>’ syntax
 Tmpl_Enum<std::string, Test_Enum_String>::s_instances;

I've tried to put 'template <>' before definition of s_instances:

Template <> static instances_list s_instances;

But I found a more errors:

Tmpl_Enum.hpp:30:12: error: explicit specialization in non-namespace scope ‘class Tmpl_Enum<TValue, T>’
 template <> static instances_list s_instances;**

Here is my code

//===============================
//file "Tmpl_Enum.hpp"
//===============================


#include <functional>
#include <set>

template <typename TValue, typename T>
class Tmpl_Enum {

protected:

 // Constructors
 explicit Tmpl_Enum(const TValue& Value);


 // Comparison functor for the set of instances
 struct Enum_Ptr_Less:
     public std::binary_function<const Tmpl_Enum<TValue, T>*, const Tmpl_Enum<TValue, T>*, bool> {
       bool operator()(const Tmpl_Enum<TValue, T>* E_1, const Tmpl_Enum<TValue, T>* E_2)
       { return E_1->Get_Value() < E_2->Get_Value(); }
  };


public:

 typedef std::set<const Tmpl_Enum<TValue, T>*, Enum_Ptr_Less> instances_list;
 typedef typename instances_list::const_iterator const_iterator;

 const TValue& Get_Value(void) const { return m_value; }

protected:
 TValue m_value;
 static instances_list s_instances;
};

template <typename TValue, typename T>
inline Tmpl_Enum<TValue, T>::Tmpl_Enum(const TValue& Value):
 m_value(Value)
{
 s_instances.insert(this);
}


//===============================
//file "Test_Enum_String.hpp"
//===============================

#include <string>

#include "Tmpl_Enum.hpp"

class Test_Enum_String:
  public Tmpl_Enum<std::string, Test_Enum_String> {

private:

  explicit Test_Enum_String(const std::string& Value):
    Tmpl_Enum<std::string, Test_Enum_String>(Value) { }

public:

  static const Test_Enum_String enum_Alpha;
  static const Test_Enum_String enum_Beta;
  static const Test_Enum_String enum_Delta;
  static const Test_Enum_String enum_Epsilon;
  static const Test_Enum_String enum_Omega;
};



//===============================
//file "Test_Enum_String.cpp"
//===============================

#include "Test_Enum_String.hpp"


Tmpl_Enum<std::string, Test_Enum_String>::instances_list
Tmpl_Enum<std::string, Test_Enum_String>::s_instances;

const Test_Enum_String Test_Enum_String::enum_Alpha("Alpha");
const Test_Enum_String Test_Enum_String::enum_Beta("Beta");
const Test_Enum_String Test_Enum_String::enum_Delta("Delta");
const Test_Enum_String Test_Enum_String::enum_Epsilon("Epsilon");
const Test_Enum_String Test_Enum_String::enum_Omega("Omega");




//===============================
//file "Test_Enum_String.cpp"
//===============================
Kevin Brown-Silva
  • 40,873
  • 40
  • 203
  • 237
Peluo
  • 11
  • 3

2 Answers2

1

Finally I found the problem. It is requested to initialize the variable to get the specialization, so :

template <>
Tmpl_Enum<std::string, Test_Enum_String>::instances_list Tmpl_Enum<std::string, Test_Enum_String>::s_instances=
        std::set<const Tmpl_Enum<std::string, Test_Enum_String>*, Enum_Ptr_Less> ();

The clue was: C++: specializing member requires «template<>» syntax

I'm a beginner, but the syntax required for using templates is intimidating.

Community
  • 1
  • 1
Peluo
  • 11
  • 3
  • A more human readable: `template <> Test_Enum_String::instances_list Tmpl_Enum::s_instances=instances_list();` – Peluo Jan 04 '16 at 21:01
0

can you try and add template<>

like this:

template<>
Tmpl_Enum<std::string, Test_Enum_String>::instances_list
Tmpl_Enum<std::string, Test_Enum_String>::s_instances;
Niclas
  • 156
  • 1
  • 7
  • Dear Niclas, thank you for your quick response. Adding 'template<>' raise a new error: '/Tmpl_Enum.hpp:37: undefined reference to `Tmpl_Enum::s_instances' – Peluo Dec 30 '15 at 11:35