我正在使用C++编写一个跨平台库。MSVC编译很好,但是g++却出了问题。假设我有以下的枚举帮助类:
// 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
这是预期的使用方式:
// 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();
}
使用g++编译时,我遇到了“在不同命名空间中特化模板”的错误。将DECLARE_ENUM块包装在MyLib命名空间中可以解决此问题。我的问题是为什么我必须这样做,是否有另一种修复方法,不需要在块周围添加MyLib命名空间?
MyLib::
,并且明确地专门化了隐式实例化的成员。事实上,clang 接受这段代码,除了打字错误。 - T.C.