2010-10-21 66 views
1

我有Utils.h類聲明:升壓1.44.0 + VS2010私有成員錯誤

class Utils { 
private: 
    static boost::mutex outputMutex; 
    }; 

在cpp文件:

boost::mutex Utils::outputMutex = boost::mutex(); 

我得到:

Error 1 error C2248: 'boost::mutex::mutex' : cannot access private member declared in class 'boost::mutex' 

如果我們看裏面boost/thread/win32/mutex.hpp我們看到:

namespace boost 
{ 
    class mutex: 
     public ::boost::detail::underlying_mutex 
    { 

    // ...  

    public: 
     mutex() 
     { 
      initialize(); 
     } 

有沒有人知道我在這裏失蹤?它用於在VS2008的另一臺機器上編譯OK。

謝謝。

回答

2

.cpp文件應該是:

boost::mutex Utils::outputMutex; 

沒有必要進行分配。它將被適當地構建。

+0

這不是賦值,它是複製初始化。 – GManNickG 2010-10-21 01:54:38

+0

這個工程。如果我沒有記錯(不確定),它需要VS2008中的任務。乾杯:) – Mau 2010-10-21 02:50:49

0

它看起來像是聲明Utils::outputMutex兩次,一次在類聲明中,然後再次在.cpp中聲明。另外,第二個聲明被分配了構造函數的「返回值」,這是不可能的。如果刪除第二個聲明會發生什麼?

+0

其靜態初始化/定義 – Anycorn 2010-10-21 01:35:34

+0

@aaa:你的回答是正確的,你應該取消刪除它。 – GManNickG 2010-10-21 01:45:52

+1

需要有一個「取消刪除的投票」。 – dreamlax 2010-10-21 01:54:42

3

你有什麼是複製初始化,相當於:

boost::mutex Utils::outputMutex(boost::mutex()); 

它調用拷貝構造函數。但是,mutex是不可複製的。只要讓它默認構造:

boost::mutex Utils::outputMutex; 
+0

說實話,我不太確定,因爲它曾被提及過。 – Anycorn 2010-10-21 02:23:42