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?

questionAnswers(1)

yourAnswerToTheQuestion