2010-10-21 68 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