1

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

2 回答 2

0

AFAIK,您将不得不扩展 clang 以支持类范围内的显式专业化。我认为没有办法解决它,除非你想修改库。

于 2013-04-19T09:40:09.837 回答
0

我想你会有三种可能:

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

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

template<>
void foo(bool, void* p)
{
    t = (T)p;
}

它可能是 Clang 实现该扩展的一个错误。

于 2013-04-19T09:40:30.337 回答