构造函数参数无法识别
问题描述:
试图在下面的代码来构建嵌套类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
构造函数的编译器无法识别的说法。我做错了什么?
答
此行不会做你认为它的作用:
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::mutex
和std::lock_guard
来代替。
请提供[最小,完整和可验证示例](http://www.*.com/help/mcve)。这至少需要发布你正在用来构造'Locker'的实际代码,以及你得到的实际编译错误。 – Barry
@Barry现在有一个更好的例子。 – xiver77
@ xiver77'A :: B(a);'这不符合你的想法。 – PaulMcKenzie