2012-03-04 17 views
2

<mutex>ヘッダーの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

+1

'using namespace std;'を使いましたか? 'std'のすべてのメンバーが現在のスコープに導入され、あなたはそれらを紹介できません。また、コンパイラエラーを提供してください。 RRDのmutexも 'std'に入っていると確信していますか? – Zeta

+0

ああ、私は混乱を参照してください、それは名前空間stdにはありませんが、RRDのmutexはstdです(これはstd atomics、mutexなどの代わりにドロップされるように設計されているためです) :unique_lock。 – Eloff

答えて

3

あなたは、独自の名前空間に#include RRDができます:RRDは言及しない限り、

namespace RRD { 
    #include <rrd.h> 
} 

これは動作するはずですグローバル・ネームスペース関数(例えば、::isalnum)に変換します。

次に、あなたの現在の名前空間にインポートクラス:

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

は最後に、あなたのコードではなく、std::mutexmutexを使用しています。グローバル名前空間に存在するものに関心がある場合は、上記のコードを独自のnamespaceにラップすることができます。

+0

しかし、今はstd :: mutexなどを置き換えるためにRLDのmutexを使用する必要がありますが、どうしたらいいですか? – Eloff

+0

RRDとSTDを一緒に使用する方法を追加しました。 – user1071136

+0

これはうまくいきます。これを答えとして受け入れるつもりです – Eloff

関連する問題