【问题标题】:Why is class member variable not allowed to be [ &A, &B ] in PPL为什么类成员变量在 PPL 中不允许为 [ &A, &B ]
【发布时间】:2013-02-13 08:04:25
【问题描述】:

在编译VS之前说

错误成员“test::A”不是变量

错误成员“test::B”不是变量

代码:

#include <iostream>
#include <ppl.h>

using namespace concurrency;
using namespace std;

class test
{
        static double A[ 3 ][ 3 ];
        static double B[ 3 ][ 3 ];
public:
        int test_function();
};

double test::A[ 3 ][ 3 ] = { {  0.7,  -0.2,   -1   },
                             { -4,    -2,     -2   },
                             { -0.4,   1.7,   -1.8 } };

double test::B[ 3 ][ 3 ] = { {  0.6,  -1.2,    1.1 },
                             {  2,     3,     -2   },
                             { -1,     0.05,   0.05} };

int test::test_function()
{
    parallel_for ( 0, 100, [ &A, &B ]( int y ) {
        for ( int x = 0; x < 100; x++ ) {

            for ( int i = 0; i < 3; i++ )
                for ( int j = 0; j < 3; j++ )
                     A[ j ][ i ] += A[ j ][ i ] * B[ j ][ i ];

        }
    } );
}

int main()
{
        return 0;
}

错误:

'test::A': lambda 捕获变量必须来自封闭函数范围

'test::B': lambda 捕获变量必须来自封闭函数范围

我该怎么办?

【问题讨论】:

  • 它在没有任何捕获的情况下工作吗?您不需要捕获静态数据。
  • 为什么一定要捕获静态变量?
  • 我是 C++ 新手,没有任何捕获怎么办?可以举个例子吗?
  • 只需将[ &amp;A, &amp;B ] 更改为[]
  • 我更改代码,我应该保护 A 和 B,因为共享项目

标签: c++ parallel-processing ppl


【解决方案1】:

捕获静态是没有意义的,因为它们是类静态。在函数中定义的 lambda 与在其中定义的函数具有相同的可访问性。因此,在该函数中可见的变量(如类私有)在 lambda 中可见。

类静态成员仍然存在,即使函数被传递到其他地方或超出当前范围。

因此,只需在 lambda 中使用 [] 而不是 [ &lt;stuff&gt; ]

【讨论】:

  • 除非它们是私有全局变量。他们还有访问权限吗?
  • @Pubby:对不起;错过了。但逻辑保持不变。是的,他们可以访问;来自类成员的 lambda 被视为类成员。
  • 如何保护A,是否为全局共享项?
  • @user2055437:你需要什么来保护它?可以从成员(和朋友)内部访问私有变量。您的 lambda 实际上是代理成员,因为它可以访问私有变量。更不用说,lambda 定义在与成员函数相同的位置,因此任何可以将一些代码偷偷带入 lambda 的人都可以将一些代码偷偷带入成员函数。没有什么可以保护A
  • 我问错了,不保护让我们说锁定它们,因为在进程中A数组的结果不同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
相关资源
最近更新 更多