Especialização de modelo em espaço para nome diferente
Estou desenvolvendo uma biblioteca de plataforma cruzada usando C ++. O MSVC compila bem, mas o g ++ está me dando problemas. Suponha que eu tenha a seguinte classe auxiliar Enum:
// File: Enum.h
#ifndef ENUM_H
#define ENUM_H
#include <map>
#include <cstring>
namespace MyLib {
#define DECLARE_ENUM( type ) template<> std::map<const char*, type> \
MyLib::Enum<type>::mMap = std::map<const char*, type>(); \
template<> MyLib::Enum<type>::Enum (void)
template <typename Type> class Enum
{
private:
Enum (void);
public:
static int Size (void) { /* ... */ return 0; }
private:
static std::map<const char*, Type> mMap;
};
}
#endif
Aqui está o uso pretendido:
// SomeFile.cpp
#include "Enum.h"
enum MyEnum
{
value1, value2, value3,
};
DECLARE_ENUM (MyEnum)
{
mMap["value1"] = value1;
mMap["value2"] = value2;
mMap["value3"] = value3;
}
void SomeFunc (void)
{
cout << Enum<MyEnum>::Size();
}
O g ++ me fornece um erro "Especialização de modelo em namespace diferente". A disposição do bloco DECLARE_ENUM no namespace MyLib resolve esse problema. Minha pergunta é por que eu tenho que fazer isso e existe outra maneira de corrigir isso que não exige que eu adicione um namespace MyLib ao redor do bloco?