- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 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/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!