2013-02-13 43 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

相關問題