无法识别构造函数参数



当试图在以下代码中构建嵌套类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::mutexstd::lock_guard

相关内容

最新更新