gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:36:19 24 4
gpt4 key购买 nike

我正在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com