2010-10-21 7 views
1

J'ai une déclaration de classe Utils.h:Boost 1.44.0 + VS2010 erreur membre privé

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

Dans le fichier cpp:

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

Je reçois:

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

Si nous regardons à l'intérieur boost/thread/win32/mutex.hpp nous voyons:

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

    // ...  

    public: 
     mutex() 
     { 
      initialize(); 
     } 

Est-ce que quelqu'un sait ce que je manque ici? Il compilait OK sur une machine différente avec VS2008.

Merci.

Répondre

2

Le fichier .cpp doit être:

boost::mutex Utils::outputMutex; 

Il n'y a pas besoin d'une cession. Il sera construit de manière appropriée.

+0

Ce n'est pas une affectation, c'est une initialisation de copie. – GManNickG

+0

Cela fonctionne. Si je me souviens bien (pas sûr), il fallait l'affectation dans VS2008. Bravo :) – Mau

0

Il semble que vous déclariez Utils::outputMutex deux fois, une fois dans la déclaration de classe, puis de nouveau dans le fichier .cpp. De plus, la seconde déclaration reçoit la "valeur de retour" du constructeur, ce qui n'est pas possible. Que se passe-t-il si vous supprimez la seconde déclaration?

+0

son initialisation statique/définition – Anycorn

+0

@aaa: Votre réponse est juste, vous devez annuler la suppression. – GManNickG

+1

Il doit y avoir un "vote pour restaurer". – dreamlax

3

Qu'est-ce que vous avez est une copie-initialisation, et équivaut à:

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

qui appelle le constructeur de copie. Cependant, mutex est non recouvrable. Il suffit de le laisser par défaut construction:

boost::mutex Utils::outputMutex; 
+0

pour être honnête, je n'étais pas tout à fait sûr car il a été mentionné que cela a fonctionné avant. – Anycorn