Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用受限函数时的尾部返回类型问题_C++_Templates_C++11_Template Meta Programming_C++ Amp - Fatal编程技术网

C++ 使用受限函数时的尾部返回类型问题

C++ 使用受限函数时的尾部返回类型问题,c++,templates,c++11,template-meta-programming,c++-amp,C++,Templates,C++11,Template Meta Programming,C++ Amp,我正在使用C++AMP为内部编写一个库,我发现以下内容不起作用,我很好奇为什么(如果我从functor中删除restrict(AMP),它会起作用): 关键字告诉编译器只有一个指向该对象的指针。 这允许编译器进行各种优化 但是,TestFunc正在按值接收指针函数。因此,编译器已经知道您试图通过复制该指针来欺骗它 要避免复制,请通过引用传递参数: template <typename T, typename Func> auto TestFunc(T t, Func& f)

我正在使用C++AMP为内部编写一个库,我发现以下内容不起作用,我很好奇为什么(如果我从functor中删除
restrict(AMP)
,它会起作用):

关键字告诉编译器只有一个指向该对象的指针。
这允许编译器进行各种优化

但是,TestFunc正在按值接收指针函数。因此,编译器已经知道您试图通过复制该指针来欺骗它

要避免复制,请通过引用传递参数:

template <typename T, typename Func>
auto TestFunc(T t, Func& f) -> SumType<decltype(f(t))>
{
    return f(t) + f(t);
}
模板
自动测试函数(T、T、f)->SumType
{
返回f(t)+f(t);
}

我相信您想要的是本手册的第2.2节。出现错误“没有函数模板'TestFunc'的实例与参数列表匹配”,因为调用
TestFunc
的代码不在内部,并且限制(amp)lambda(作为每个
并行\u的一部分)。因此,编译器正在查找带有
restrict(cpu)
装饰的TestFunc

如果按照以下方式更改声明,代码是否编译:

    auto f = [](float flVal) restrict(amp, cpu) {
        return flVal * flVal;
    };

在amp
parallel\u的上下文之外为每个
调用amp-restricted函数/lambda有点毫无意义,也永远不会工作。即使您可以欺骗编译器使其不出错。

如果您将
restrict(amp)
添加到
TestFunc
(即
auto-TestFunc(…)restrict(amp)->…
)@0x499602D2我收到一个编译器错误,通知我没有重载具有正确的限制说明符。这些错误是完整的错误吗?@0x499602D2否;第一个错误(没有实例…)是完整的:
error C2893:未能专门化函数模板的未知类型TestFunc(T,Func)“1>具有以下模板参数:1>“T=float”1>“Func=main::”
,第二个是:
错误C3930:“TestFunc”:没有重载函数具有与环境上下文“main”兼容的限制说明符。
这是
限制
关键字的不同用法,不幸的是;它是MSVC的非标准扩展,允许在GPGPU上下文中对函数的有效性进行编译时检查;这是我自己想出来的,但忘了在这里回答这个问题,所以谢谢你的澄清!!
template <typename T, typename Func>
auto TestFunc(T t, Func& f) -> SumType<decltype(f(t))>
{
    return f(t) + f(t);
}
    auto f = [](float flVal) restrict(amp, cpu) {
        return flVal * flVal;
    };