simd 유형에 대한 sqrt 래퍼 함수를 제공하여 std :: sqrt와 함께 템플리트에서 사용할 수 있습니다.clang이 호출 사이트보다 먼저 선언 된 함수를 찾지 못하는 이유는 무엇입니까?
이제는 어떻게 든 보이지 않는 문제가 있습니다. 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에서 자작에서 3.9.1을 사용합니다.
예. 교과서 이름은 숨어 있습니다. 가끔씩 클래스에서 Base :: foo를 사용하여 석고를 사용하는 것과 같은 이유 (ish). 확실히 C++의 "초보자"에게는 직관적이지 않지만 결국 익숙해집니다. –
좋아요, 맞아요, 이해합니다. 왜'std :: sqrt'를 완전히 사용하는지 설명 할 때 왜 작동하는지 알고 있습니까? – thorink
@ thorink 그 이유는 "해야 할 일 :"대답의 일부가 필요하지 않기 때문입니다. 이름 검색은 C가 표준 라이브러리에서 그렇게 정의한 이후 실제로 전역 이름 공간에있는 sqrt를 검색합니다. – iheanyi