C++ 使用受限函数时的尾部返回类型问题
我正在使用C++AMP为内部编写一个库,我发现以下内容不起作用,我很好奇为什么(如果我从functor中删除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)
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;
};
在ampparallel\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;
};