【发布时间】:2012-11-30 22:17:00
【问题描述】:
以下代码无法编译。错误消息是:
错误 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) 并将 lambda 中的 f1() 调用替换为 5 时,程序编译得很好。那么 amp 函数的默认参数中函数调用的规则是什么?
【问题讨论】:
-
我遇到了来自 GCC 和 MSVC 的奇怪消息。原来我有一个
MyStruct的数组,并且元素的数量减少了一个:MyStruct s_val[3] = { MyStruct(...), MyStruct(...) };。两个编译器都没有告诉我计数已关闭。
标签: c++ visual-c++ c++11 visual-studio-2012 c++-amp