用clang编译MSVC std库.在类范围内显式的模板函数特化
Compiling MSVC std lib with clang. Explicit template function specialization at class scope
我正在尝试使用Clang编译MSVC标准库。但是它失败了,因为标准库在类作用域中使用了显式的模板函数特化。
这是一个MS扩展,显然在Clang中不可用。
下面是一个简单的例子,在MSVS下可以很好地编译,但在Clang下不行。
template<class T>
class A
{
public:
A()
{
foo((T)0, 0);
}
template<class T2>
void foo(T2, void* p) {}
template<>
void foo<bool>(bool, void* p)
{
t = (T)p;
}
T t;
};
int main()
{
A<bool> a;
return 0;
}
在使用Clang时,我应该怎么做才能使这个特性工作,这样我才能编译MSVC标准库?
这是我得到的编译错误:warning: explicit specialization of 'foo' within class scope is a Microsoft extension [-Wmicrosoft]
void foo<bool>(bool, void* p)
error: expected ';' after expression
t = (T)p;
^
;
error: no member named 'T' in 'A<bool>'
t = (T)p;
^
我认为你有三种可能:
- 重写MSVC库,使其不使用该扩展(可能很有趣,但耗时…)
- 修复Clang中的ms扩展(可能更有趣和耗时…)
- 做同样的事情:将每个库与编译器一起使用(多么无聊…)
从Clang的测试代码中更新我假设它已经实现了,但是它不需要一个显式的模板参数:
template<>
void foo(bool, void* p)
{
t = (T)p;
}
您必须扩展clang以支持类范围内的显式专门化。除非你想修改库,否则我认为没有别的办法。
相关文章:
- C++ 在编译过程中 strtok 函数 Eclipse 说没有在范围内声明?
- 私有在函数定义/实现的返回值范围内是什么意思 (c++)?
- 哪个函数负责C++全局范围内的类对象初始化?
- 如何将不在 QT 全局范围内的函数附加到 Qwidget 上
- 在命名成员函数重载解析期间,"this"何时不在范围内?
- GCC 或 Clang 关于函数参数在其自己的默认参数中的范围内的名称是否正确?
- 函数未在此范围内声明
- 模板化函数范围内的条件模板化类型别名
- 在某个值范围内生成 BST 的泛型函数
- 在构造函数中 'cout' 未在此范围内声明
- 通过使用全局变量的函数访问在给定范围内被覆盖的变量
- 是否有函数可以检索范围内可用非重复值的数量
- 如何全局创建对象并使用该对象访问全局范围内的公共成员函数
- C++ 收到错误,指出函数未在此范围内声明
- 是否可以编写一个在函数范围内使用时会抱怨的宏
- Arduino-setup()中声明的变量不在函数范围内
- C++-函数范围内的函数声明
- 我是否要删除函数范围内的内存?
- ISO C++03对在函数范围内定义的结构有什么限制
- OpenGL中绘制函数范围内的静态变量