2015-05-24 127 views
1

試圖在下面的代碼來構建嵌套類A::B的實例時我得到一個編譯器錯誤:構造函數參數無法識別

#include <cstdio> 

using namespace std; 

struct A{ 
    int n; 

    A(): 
    n(1){} 

    struct B{ 
     A& a; 

     B(A a): 
     a(a){ 
      a.n=2; 
     } 

     ~B(){ 
      a.n=0; 
     } 
    }; 
}; 

int main() { 
    A a; 
    printf("%d\n",a.n); 
    do{ 
     A::B(a); 
     printf("%d\n",a.n); 
    }while(false); 
    printf("%d\n",a.n); 
    return 0; 
} 

當我打電話的A::B構造函數的編譯器無法識別的說法。我做錯了什麼?

+1

請提供[最小,完整和可驗證示例](http://www.stackoverflow.com/help/mcve)。這至少需要發佈你正在用來構造'Locker'的實際代碼,以及你得到的實際編譯錯誤。 – Barry

+0

@Barry現在有一個更好的例子。 – xiver77

+0

@ xiver77'A :: B(a);'這不符合你的想法。 – PaulMcKenzie

回答

2

此行不會做你認爲它的作用:

A::B(a); 

括號實際上是多餘的。這條線就相當於:

A::B a; 

而且也沒有默認構造B,因此編譯錯誤。你需要的對象,你可以調用_額外的跡象表明,它只是有一個範圍後衛提供了一個名字:

A::B _(a); 
+0

他的構造函數也在製作副本,並且在那裏也有一個懸掛引用。 – 0x499602D2

1

這基本上是最讓人頭疼的解析的變體。驗證碼:因爲需要你沒有提供的一個參數構造函數

CriticalSection::Locker(cs); 

...不定義CriticalSection::Locker類型的對象。

治癒率是定義對象的名稱:

CriticalSection::Locker lock(cs); 

你也可以使用「萬能」初始化:

CriticalSection::Locker lock{cs}; 

這樣一來,如果你不小心漏掉的名字你試圖定義的對象,你可能會得到一個錯誤信息,至少對於發生的事情更清楚一點。另外:除非你確定你從使用wx變體中獲得了一些東西,否則我至少會考慮使用std::mutexstd::lock_guard來代替。