0

私のコードは、サードパーティのライブラリと衝突しています。私はこれを定義します:

inline __m128 operator + (__m128 a, __m128 b)
{
    return _mm_add_ps(a, b);
}

しかし得る

error C2084: function '__m128 operator +(const __m128,const __m128)' already has a body

サードパーティのライブラリを変更することはできず、この演算子が定義されていることを識別するものを #define しません。彼らの定義が普及することを誰もが知っている(おそらくSFINAEを使用する)方法はありますか?

4

1 に答える 1

2

その演算子を定義したい理由はありますか? タイプを定義するライブラリから定義されるべきではありません__m128か?

演算子は、実際には引数の型のインターフェイスの一部です。これらは、外部の関係者 (この場合はあなた)によって定義されるべきではありません。

SFINAE はテンプレートにのみ適用されるため、SFINAE は少なくとも直接的には役に立ちません。また、実際にはテンプレートが必要ないためです (どのoperator+タイプにも提供したくないでしょう?)。十分な努力をすれば、動作するように見えるものを構築できますが、ソース コードでこれらの型を使用するたびにコンパイラがライブラリ内の演算子の定義を確認するかどうかに依存します。+

すべてのユース ケースではなく一部のユース ケースでリンクされているライブラリで演算子が定義されている場合、演算子の定義を でラップし#ifdef、define を使用して、ビルド時に演算子を定義するかどうかを制御できます。

于 2013-09-27T17:10:02.423 に答える