2012-03-04 24 views
2

我想包括std :: unique_lock和其他名称<互斥量>标题,但不是std :: mutex和其他名称(我有一个不同的声明 - 在Relacy Race Detector中,如果你好奇的话)。这是造成编译错误。我怎样才能做到这一点?解决包括冲突(重新定义)或如何选择包括声明的成员

编辑:当RRD和<互斥>包括发生编译器错误是:

error C2371: 'rl::condition_variable' : redefinition; different basic types C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\mutex 58 1 test_hashtable 
error C2371: 'rl::mutex' : redefinition; different basic types C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\mutex 100 1 test_hashtable 
error C2371: 'rl::recursive_mutex' : redefinition; different basic types C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\mutex 114 1 test_hashtable 
+2

您是否必须在std的名称空间中拥有您的互斥锁? – Pubby 2012-03-04 20:22:07

+1

您是否使用'使用名称空间标准;'?然后,所有'std'的成员都被引入到当前的作用域中,并且不能不引入它们。请提供您的编译器错误。你确定,RRD互斥量也是'std'吗? – Zeta 2012-03-04 20:23:46

+0

啊,我看到了混乱,不是它在命名空间std中,而是RRD互斥体也是std(因为它被设计成替代std atomics,mutex和其他的),但它不包括像std这样的东西: :unique_lock。 – Eloff 2012-03-04 20:31:09

回答

3

你可以#include RRD到它自己的命名空间:

namespace RRD { 
    #include <rrd.h> 
} 

这应该工作,除非RRD指到全局命名空间功能(例如,::isalnum)。

然后,导入类到当前的命名空间:

#ifdef DETECT_RACE_CONDITIONS 
using RRD::std::mutex; 
#else 
using std::mutex; 
#end 
using std::unique_lock; 

最后,在你的代码,而不是std::mutex使用mutex。如果你关心的是全局命名空间中的东西,你可以将上面的代码包装在它自己的namespace中。

+0

好的,但现在我需要使用RLD中的互斥来代替std :: mutex和其他,我该怎么做? – Eloff 2012-03-04 20:54:25

+0

增加了将RRD和STD一起使用的可能方法。 – user1071136 2012-03-04 21:23:43

+0

好吧,这将工作,我会接受这个作为答案 – Eloff 2012-03-04 21:44:21