构造函数参数无法识别

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::mutexstd::lock_guard