最近,我一直在使用放大器(C++ Accelerated Massive Parallelism)。使用此框架需要使用restrict(amp)的许多lambda表达式。但是,当我尝试在模板类中编写这些代码时,编译器会抛出Error C2760 syntax error: unexpected token 'identifier', expected '{'错误消息。但是,它在没有restricted(amp)或模板类之外也可以完美地工作。这是可以重现此问题的代码:

//matrix2.cpp
#pragma once
#include "stdafx.h"

namespace rin
{
    template <int V0, int V1>
    class Matrix2
    {

    public:
        Matrix2() : raw_(V0 * V1), view_(concurrency::extent<2>(V0, V1), raw_)
        {
            concurrency::parallel_for_each(concurrency::extent<2>(V0, V1),
                [=](concurrency::index<2> idx)
                restrict(amp)
            {

            });
            auto fun = [=]() restrict(cpu)
            {
                std::cout << "It does not compile in a template class." << std::endl;
            };
            fun();
            auto fun1 = [=]()
            {
                std::cout << "It does compile in a template class without the restrict(...)." << std::endl;
            };
            fun1();
        }
        std::vector<double> raw_;
        concurrency::array_view<double, 2> view_;
    };
}

//main.cpp
#include "stdafx.h"
#include "matrix.h"
using namespace rin;
using namespace concurrency;
int main()
{
    Matrix2<5, 5> mat;
    auto fun = [=]() restrict(cpu)
    {
        std::cout << "But outside the template class it does work!" << std::endl;
    };
    fun();
    system("pause");
    return 0;
}

最佳答案

我最近遇到了同样的问题。此错误是由C++编译器选项“一致性模式”(项目属性> C / C++>语言)引起的,该选项在最近的VS版本中似乎设置为默认启用。将此选项设置为no,您的代码应编译。

c&#43;&#43; - 在模板类中编写的lambda函数不支持restrict(...)吗?-LMLPHP

关于c++ - 在模板类中编写的lambda函数不支持restrict(...)吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49939880/

10-12 16:31