Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ';类';:类型参数';参数';与声明不符_C++_Visual Studio - Fatal编程技术网

C++ ';类';:类型参数';参数';与声明不符

C++ ';类';:类型参数';参数';与声明不符,c++,visual-studio,C++,Visual Studio,此代码使用Visual Studio 2015成功编译,但在Visual Studio 2019中,我收到以下错误: “std::lock\u guard”:模板参数“\u Mutex”与声明不兼容 错误行: 模板好友类std::lock\u guard;//C++17或MSVS2015 安全ptr.h: #pragma一次 #ifndef安全PTR\H #定义安全PTR_H #包括 #包括 #包括 #包括 #包括 #包括 #包括 #include.std::lock\u guard是一个只包

此代码使用Visual Studio 2015成功编译,但在Visual Studio 2019中,我收到以下错误:

“std::lock\u guard”:模板参数“\u Mutex”与声明不兼容

错误行:

模板好友类std::lock\u guard;//C++17或MSVS2015
安全ptr.h:

#pragma一次
#ifndef安全PTR\H
#定义安全PTR_H
#包括
#包括
#包括
#包括
#包括
#包括
#包括

#include.

std::lock\u guard
是一个只包含一个模板参数的模板,请参阅

template
表示引用的声明包含零个或多个模板参数,这会导致错误消息“与声明不兼容”

这个问题的一个最简单的例子是:

template <typename X> class Bar {};
template <typename... Xs> class Foo {};

class Baz {
    template<class> friend class Bar;
    template<class...> friend class Foo;
};
模板类条{};
模板类Foo{};
Baz类{
模板好友类栏;
模板好友类Foo;
};
这是MSVS 2015(1900)中的一个bug,它在MSVS 2015中实现为

模板类锁紧装置

所以这样的宏可以用来修复MSVS1900中的这个错误

所有其他编译器都使用正确的实现
模板类锁\u-guard


最初在C++17中,针对多个互斥锁提出了锁保护(可变锁保护)
模板类锁保护
针对C++17:

但后来多个互斥锁的锁保护(可变锁保护)被多个互斥锁的作用域锁(可变作用域锁)取代
模板类作用域锁

似乎在MSVS 2015中,第一个C++17草案是使用可变锁实现的,但后来C++17是使用可变范围锁发布的:


MSVS 2013(1800)


MSVS 2015(1900)


我们需要看到一个有足够代码的问题,以便在问题中重现您的问题。你的问题是要包含足够的代码,以便我们可以看到发生了什么。太多的代码。请给予赞扬。是的,我不知道操作系统/实现切换是为了什么。我已经在原作者的GitHub repo中对相关提交进行了评论。感谢你的回复,这正是我想知道的。我注意到您对多线程很感兴趣,您能告诉我应该怎么做:我在多个线程中使用一个对象(在std::map中),我需要使用什么,线程安全对象还是线程安全容器?再次感谢。@chaot1c您应该使用线程安全对象(如果您不从映射中删除此对象并且不更改其键)