2012-11-30 4 views
5

다음 코드는 컴파일되지 않습니다. 오류 메시지는 다음과 같습니다제한 (암페어) 함수의 기본 매개 변수

오류 1 :

error C3930: 'foo' : no overloaded function has restriction specifiers that are compatible with the ambient context '' 

오류 2 :

error C2660: 'f1' : function does not take 0 arguments 

오류 3 :

IntelliSense: amp-restricted function "int foo() restrict(amp)" (declared at line 5) must be called from an amp-restricted function 

프로그램 :

#include <amp.h> 
#include <iostream> 
using namespace std; 

int foo() restrict(amp) { return 5; } 

int f1(int x = foo()) restrict(amp) { 
    return x; 
} 

int main() 
{ 
    using namespace concurrency; 

    int a[10] = {0}; 
    array_view<int> av(10, a); 

    parallel_for_each(av.extent, [=](index<1> i) restrict(amp) { 
    av[i] = f1(); 
    }); 

    for(unsigned i=0; i<10; ++i) { 
    cout << av[i] << "\n"; 
    } 
    return 0; 
} 

이상하게도, foo()에있는 restrict(amp)을 제거하고 람다에있는 f1()의 전화 번호를 예를 들어 5으로 바꾸면 프로그램이 잘 컴파일됩니다. 그렇다면 앰프 함수의 기본 인수에서 함수 호출에 대한 규칙은 무엇입니까?

+0

GCC와 MSVC 모두에서 기괴한 메시지가 나타납니다. 그것은'MyStruct'의 배열을 가지고 있고, 요소의 수는 하나씩 꺼져 있습니다 : MyStruct s_val [3] = {MyStruct (...), MyStruct (...)}; 어떤 컴파일러도 카운트가 꺼져 있다고 말하지 않았습니다. – jww

답변

2

MSDN Forum answer 질문하기. 우리가 선택한 기본 인수

의미 체계는 특히,이 규칙에 몇 가지 중요한 예외에도 불구하고 (한 왼쪽에서 오른쪽으로 패스에서 수행되는 프로그램의 분석 ++ C의 무엇보다 중요한 전제 정렬 그러므로, 제한 지정자는 함수 매개 변수 선언 다음에 읽히므로 기본 인수 표현식에있는 함수 호출은 더 좋거나 나쁘게 "외부"제한 지정에 따라 바인딩됩니다. 즉, 처음부터 cpu-restriction "active"(기본값이기 때문에)를 읽고 관련 범위를 닫는 "restrict (X)"와 "}"사이의 모든 것에 대해 제한 X로 전환합니다.

+0

당신은 아마 이것을 설명해야합니다. MSDN을 인용하는 것 외에는 무엇을 얻고 있는지 분명하지 않습니다. – jww