1

次のような ReadLock を実装しました。

私のmyClass.hで

#include <boost/thread/locks.hpp>
#include <boost/thread/shared_mutex.hpp>

typedef boost::shared_mutex Lock;
typedef boost::shared_lock< Lock > ReadLock;

Lock myLock;

myClass.cpp で:

void ReadFunction() const
{
    ReadLock r_lock(myLock); // Error!
    //Do reader stuff
}

コードは VS2010 で動作しますが、GCC4.0 では失敗しました。コンパイラは、一致する関数がないことを示す ReadLock でエラーをスローしています。変数 myLock の「const」の正確性の問題であると思われます。関数宣言の const を外したらエラーが消えました。誰か私にこれを説明できますか?これがWindowsでは機能するのにgccでは機能しないのはなぜですか?

ここに何か提案はありますか?ありがとう。

4

1 に答える 1

2

非メンバー関数またはref修飾子で修飾することは違法であり、意味がないため、 からconst修飾子を削除する必要があります。または、あなたがやろうとしていることを にカプセル化します。ReadFunction()cvclass


void ReadFunction() const
{
    ReadLock r_lock(myLock); // Error!
    //Do reader stuff
}

constメンバー関数にのみ適用できます。上記のコードはメンバー関数ではありません。メンバー関数である場合は、次のようになります (たとえば、 という名前のクラスMyClass)。

void MyClass::ReadFunction() const
{
    ReadLock r_lock(myLock);
    //Do reader stuff
}

その場合、通常はメンバーを作成lockする必要があります。mutable次のように宣言します。

class MyClass{
    ....
    mutable Lock myLock;
};
于 2016-11-04T03:30:52.163 に答える