当试图在以下代码中构建嵌套类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("%dn",a.n);
do{
A::B(a);
printf("%dn",a.n);
}while(false);
printf("%dn",a.n);
return 0;
}
当我调用A::B
的构造函数时,编译器不识别参数。我做错了什么?
这一行并不像你想象的那样:
A::B(a);
括号实际上是多余的。这一行相当于:
A::B a;
并且B
没有默认构造函数,因此会出现编译错误。您需要为对象提供一个名称,您可以将其称为_
,以作为附加指示,它只是作为作用域保护:
A::B _(a);
这基本上是最令人烦恼的解析的一种变体。代码:
CriticalSection::Locker(cs);
…没有定义类型为CriticalSection::Locker
的对象,因为您没有按需要向该对象提供参数。
方法是定义对象的名称:
CriticalSection::Locker lock(cs);
你也可以使用"通用"初始化:
CriticalSection::Locker lock{cs};
这样,如果您不小心遗漏了要定义的对象的名称,您可能会得到一个错误消息,至少可以更清楚地了解发生了什么。
作为题外话:除非你非常确定你从使用wx变体中获得了一些东西,否则我至少会考虑使用std::mutex
和std::lock_guard
。