构造函数参数无法识别

问题描述:

试图在下面的代码来构建嵌套类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.*.com/help/mcve)。这至少需要发布你正在用来构造'Locker'的实际代码,以及你得到的实际编译错误。 – Barry

+0

@Barry现在有一个更好的例子。 – xiver77

+0

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

此行不会做你认为它的作用:

A::B(a); 

括号实际上是多余的。这条线就相当于:

A::B a; 

而且也没有默认构造B,因此编译错误。你需要的对象,你可以调用_额外的迹象表明,它只是有一个范围后卫提供了一个名字:

A::B _(a); 
+0

他的构造函数也在制作副本,并且在那里也有一个悬挂引用。 – 0x499602D2

这基本上是最让人头疼的解析的变体。验证码:因为需要你没有提供的一个参数构造函数

CriticalSection::Locker(cs); 

...不定义CriticalSection::Locker类型的对象。

治愈率是定义对象的名称:

CriticalSection::Locker lock(cs); 

你也可以使用“万能”初始化:

CriticalSection::Locker lock{cs}; 

这样一来,如果你不小心漏掉的名字你试图定义的对象,你可能会得到一个错误信息,至少对于发生的事情更清楚一点。另外:除非你确定你从使用wx变体中获得了一些东西,否则我至少会考虑使用std::mutexstd::lock_guard来代替。