simd型に対していくつかのsqrtラッパー関数を提供したいので、テンプレートからstd :: sqrtと一緒に使うことができます。コールサイトの前に宣言された関数が見つからないのはなぜですか?
今、私は問題を抱えていますが、どういうわけか見えません。 stdで定義されたものだけが使用できます。
このコードの非常に減少した一部:
#include <cmath>
#include <pmmintrin.h>
using float_simd = __m128;
using double_simd = __m128d;
float_simd sqrt(float_simd a) { return _mm_sqrt_ps(a); }
double_simd sqrt(double_simd a) { return _mm_sqrt_pd(a); }
template <typename T>
void do_fancy(T val)
{
using std::sqrt;
auto ret = sqrt(val);
(void)ret;
}
int main() {
double testDouble = 1.0;
float testFloat = 1.0f;
double_simd testSimdDouble;
float_simd testSimdFloat;
do_fancy(testDouble);
do_fancy(testFloat);
do_fancy(testSimdDouble);
do_fancy(testSimdFloat);
return 0;
}
今打ち鳴らすこれを与える:
main.cpp:14:16: error: call to function 'sqrt' that is neither visible in the template definition nor found by argument-dependent lookup
auto ret = sqrt(val);
^
main.cpp:25:5: note: in instantiation of function template specialization 'do_fancy<__attribute__((__vector_size__(2 * sizeof(double)))) double>' requested here
do_fancy(testSimdDouble);
^
main.cpp:8:13: note: 'sqrt' should be declared prior to the call site
double_simd sqrt(double_simd a) { return _mm_sqrt_pd(a); }
^
main.cpp:14:16: error: call to function 'sqrt' that is neither visible in the template definition nor found by argument-dependent lookup
auto ret = sqrt(val);
^
main.cpp:26:5: note: in instantiation of function template specialization 'do_fancy<__attribute__((__vector_size__(4 * sizeof(float)))) float>' requested here
do_fancy(testSimdFloat);
^
main.cpp:7:12: note: 'sqrt' should be declared prior to the call site
float_simd sqrt(float_simd a) { return _mm_sqrt_ps(a); }
^
これは、SIMD SQRT関数は、「前に呼び出しサイトに申告しなければならない」と、述べていますしかし、私は彼らがそうだと思います。
私はウェブ検索を行いましたが、残念ながら電話と宣言の順序が実際に間違っていたケースしか見つかりませんでした。
私はちょうどusing std::sqrt
をコメントアウトし、すべて正常に動作します。私はそれを取得しない...どのようにstd :: sqrtものを見つけることができますか?
macOSで自作のclang 3.9.1を使用します。
はい。教科書の名前が隠れている。時々あなたのクラスでBase :: fooを使って石膏を塗りつぶしたのと同じ理由(ish)。間違いなくC++の「初心者」には直感的ではありませんが、最終的にはそれに慣れています。 –
大丈夫ですよ、私は理解しています...なぜstd :: sqrtを完全に使用してコメントするとき、それがなぜ機能するのか知っていますか? – thorink
@thorinkこれは「あなたがする必要がある」ためです:答えの一部は必要ありません。名前参照は、Cが標準ライブラリでそのように定義したので、実際にグローバル名前空間にあるsqrtを検索します。 – iheanyi