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

私の知る限り、クラススコープ内で明示的な特殊化をサポートするには、clang を拡張する必要があります。ライブラリを変更したくない限り、それを回避する方法はないと思います。

于 2013-04-19T09:40:09.837 に答える
0

次の 3 つの可能性があると思います。

  1. MSVC ライブラリを書き直して、その拡張機能を使用しないようにします (楽しいかもしれませんが、時間がかかります...)
  2. Clang でその MS 拡張機能を修正します (さらに楽しく、時間がかかる可能性があります...)
  3. 正気のことを行います: 各ライブラリを、それが作成されたコンパイラで使用します (なんてつまらない...)

このClang のテスト コードからの更新は、既に実装されていると想定していますが、明示的なテンプレート パラメーターは必要ありません。

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

おそらく、その拡張機能の Clang の実装のバグです。

于 2013-04-19T09:40:30.337 に答える