c++ - 不同命名空间中模板的特化

标签 c++ templates ubuntu c++11 g++

我正在使用 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++ 给我一个“不同命名空间中的模板特化”错误。在命名空间 MyLib 中包装 DECLARE_ENUM block 解决了这个问题。我的问题是为什么我必须这样做,是否有另一种不需要我在 block 周围添加命名空间 MyLib 的方法来解决这个问题?

最佳答案

由于 CWG issue 374,这在 C++11 中发生了变化和 N3064 .当前的措辞(§14.7.3 [temp.expl.spec]/p2)是:

An explicit specialization shall be declared in a namespace enclosing the specialized template. An explicit specialization whose declarator-id is not qualified shall be declared in the nearest enclosing namespace of the template, or, if the namespace is inline (7.3.1), any namespace from its enclosing namespace set.

由于您的 declarator-id 实际上是用 MyLib:: 限定的,并且全局命名空间是一个“包含专用模板的命名空间”,这看起来像一个 GCC错误(bug 56480)。你的代码编译得很好 clang in C++11 mode .

然而,在 C++98 中,必须将特化放在模板所属的 namespace 内(请参阅下面 Mark B 的评论),如果 put in C++98 mode,clang 将产生警告。 .

关于c++ - 不同命名空间中模板的特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25311512/

相关文章:

C++ operator++ 和指针

c++ - 无法在头文件中使用自定义对象?

php - CodeIgniter 创建布局/模板库

ubuntu - TypeError : gulp. 运行不是函数

c++ - 使用指针数组的函数

C++ - 模板类中模板函数的单独声明/定义

c++ - 铿锵: candidate template ignored: substitution failure: typedef 'type' cannot be referenced with a class specifier

安卓模拟器失败

ubuntu - 在 ubuntu 中用 awk 询问每行

java - 制作2D游戏的最佳编程语言和最佳工具包