构造函数参数无法识别
Constructor Argument Unrecognized
尝试在以下代码中构造嵌套 class 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);
这基本上是最令人烦恼的解析的变体。代码:
CriticalSection::Locker(cs);
...没有定义 CriticalSection::Locker
类型的对象,因为您没有根据需要向 ctor 提供参数。
治愈方法是定义对象的名称:
CriticalSection::Locker lock(cs);
你也可以使用"universal"初始化:
CriticalSection::Locker lock{cs};
这样一来,如果您不小心遗漏了要定义的对象的名称,您可能会收到一条错误消息,至少可以更清楚地了解正在发生的事情。
顺便说一句:除非你非常确定你从使用 wx 变体中获得了一些东西,否则我至少会考虑使用 std::mutex
和 std::lock_guard
。
尝试在以下代码中构造嵌套 class 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);
这基本上是最令人烦恼的解析的变体。代码:
CriticalSection::Locker(cs);
...没有定义 CriticalSection::Locker
类型的对象,因为您没有根据需要向 ctor 提供参数。
治愈方法是定义对象的名称:
CriticalSection::Locker lock(cs);
你也可以使用"universal"初始化:
CriticalSection::Locker lock{cs};
这样一来,如果您不小心遗漏了要定义的对象的名称,您可能会收到一条错误消息,至少可以更清楚地了解正在发生的事情。
顺便说一句:除非你非常确定你从使用 wx 变体中获得了一些东西,否则我至少会考虑使用 std::mutex
和 std::lock_guard
。