2013-02-13 100 views
1

之前编译VS说为什么是不允许为[&A,&B]在PPL类的成员变量

错误构件 “测试:: A” 不是变量

错误构件“测试:: 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': a lambda capture variable must be from an enclosing function scope

'test::B': a lambda capture variable must be from an enclosing function scope

我该怎么办?

+0

它没有任何捕获工作吗?你不应该需要捕捉静态。 – Pubby 2013-02-13 08:06:53

+0

为什么你必须捕获静态变量? – 2013-02-13 08:08:29

+0

我是新的C++,我怎么没有任何捕获?你可以给我一个例子吗? – user2055437 2013-02-13 08:10:08

回答

2

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

类的静态成员仍然存在,即使该函数在别处传递或超出当前范围。

因此,只需在您的lambda中使用[]而不是[ <stuff> ]

+0

除了他们是私有全局变量。他们还有访问权吗? – Pubby 2013-02-13 08:21:24

+0

@Pubby:对不起;错过了。但逻辑依然如此。是的,他们可以访问;来自类成员的lambda被认为是类成员。 – 2013-02-13 08:22:29

+0

如何保护A,它是全球共享的项目? – user2055437 2013-02-13 08:25:06

相关问题