用clang编译MSVC std库.在类范围内显式的模板函数特化

Compiling MSVC std lib with clang. Explicit template function specialization at class scope

本文关键字:函数 范围内 MSVC 编译 clang std      更新时间:2023-10-16

我正在尝试使用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;
                     ^

我认为你有三种可能:

  1. 重写MSVC库,使其不使用该扩展(可能很有趣,但耗时…)
  2. 修复Clang中的ms扩展(可能更有趣和耗时…)
  3. 做同样的事情:将每个库与编译器一起使用(多么无聊…)

从Clang的测试代码中更新我假设它已经实现了,但是它不需要一个显式的模板参数:

template<>
void foo(bool, void* p)
{
    t = (T)p;
}
这可能是Clang对该扩展的实现中的一个bug。

您必须扩展clang以支持类范围内的显式专门化。除非你想修改库,否则我认为没有别的办法。