冲突的声明 std::lock_guard<std::mutex>



我不明白为什么下面的代码会返回错误。

#include <mutex>
int main() {
std::mutex mtx;
std::lock_guard<std::mutex> (mtx);
}

lock.cpp:在函数"int main(("中:

lock.cpp:5:37:错误:冲突声明"std::lock_guardstd::mutex mtx"std::lock_guardstd::互斥(mtx(;

lock.cpp:4:16:注意:以前声明为"std::mutex mtx"std::mutex mtx;

但是,以下代码编译正确。

class Test {
public:
void lock() {
std::lock_guard<std::mutex> (this->mtx_);
std::lock_guard<std::mutex> (this->mtx_);
}
private:
std::mutex mtx_;
};

但是,下面的代码不好。

int main() {
std::lock_guard<std::mutex> (mtx);
std::lock_guard<std::mutex> (mtx);
}

您将变量mtx声明了两次

std::mutex mtx;
std::lock_guard<std::mutex> (mtx);

第一个声明可以像一样等效地重写

std::mutex ( mtx );
std::lock_guard<std::mutex> (mtx);

或者第二个声明可以像一样重写

std::mutex mtx;
std::lock_guard<std::mutex> mtx;

也就是说,您可以将声明符括在括号中。

因此,标识符CCD_ 2以不同的类型被声明两次。

您似乎忘记在第二个声明中指定标识符。:(类似的东西

std::lock_guard<std::mutex> my_lock( mtx );

编辑:使用新的代码片段更新问题后

class Test {
public:
void lock() {
std::lock_guard<std::mutex> (this->mtx_);
std::lock_guard<std::mutex> (this->mtx_);
}
private:
std::mutex mtx_;
};

然后这些记录

std::lock_guard<std::mutex> (this->mtx_);
std::lock_guard<std::mutex> (this->mtx_);

不是声明。它们是使用数据成员(访问数据成员的表达式(this->mtx_的表达式。也就是说,表达式this->mtx_不是标识符。

找出问题:

在第一个例子中:

std::mutex mtx;
std::lock_guard<std::mutex> (mtx);

在这里,您已经声明了一个类型为std::mutex的变量mtx。下一行不明确。它可以被视为声明std::lock_guard<std::mutex>类型变量的表达式,但由于您没有将参数传递给lock_guard构造函数,因此它被视为语法为*type* (*identifier*)的纯声明。你可以在这里找到更多关于解决歧义的信息。

在第二个例子中:

void lock() {
std::lock_guard<std::mutex> (this->mtx_);
std::lock_guard<std::mutex> (this->mtx_);
}

您正在尝试使用语法*type* *identifier* (*constructor arguments*),并传递类中已经存在的成员mtx_,但没有变量名。不存在由于缺少变量名而导致的歧义和错误。它只是匿名变量的声明。

第三个例子肯定不好,因为您只是重复了前1中的错误两次,声明了两个名为mtx的变量。

int main() {
std::lock_guard<std::mutex> (mtx);
std::lock_guard<std::mutex> (mtx);
}

如何解决:

正如我在评论中已经提到的,你最好为你的锁使用一个名字。要么是

std::lock_guard<std::mutex> lock(mtx);

,或者如果喜欢使用括号来分散注意力

std::lock_guard<std::mutex>(lock)(mtx);

相关内容

最新更新