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"
//===============================