2016-11-11 61 views
0

我想要使用boost :: mutex功能add我的結構單元。這裏是Detector.h未定義的參考boost ::互斥結構

class Detector { 

private: 
    struct Cell{ 
     static boost::mutex mutex_; 
     double energy; 
     double sqrt_energy; 
     int histories; 

     inline Cell(): energy(0.f), sqrt_energy(0.f), histories(0.f) { 
      boost::mutex mutex_; //I tried with and without this line 
     }; 

     inline void add(double new_energy) { 
      mutex_.lock(); 
      energy += new_energy; 
      sqrt_energy += new_energy*new_energy; 
      ++histories; 
      mutex_.unlock(); 
     }; 
    }; 

    typedef std::vector<Cell> CellVector; 
    CellVector EnergyPrimary; 

} 

在我的結構的定義,我用我的功能在Detector.cpp添加細胞的載體。

Dectetor::Detector() : { 
    nVoxelX=1024; 
    nVoxelY=1024; 
    size=nVoxelX*nVoxelY; 
    EnergyPrimary=CellVector(size); 
} 

void Detector::Score(int cellID, double new_energy) { 
    EnergyPrimary[cellID].add(new_energy); 
} 

當我嘗試編譯它,我有mutex_.lock()和mutex_.unlock一個未定義的引用錯誤()。但是爲什麼當我使用類似的函數(當我調用EnergyPrimary [cellID] .energy + = new_energy;)重載operator + =時,它會起作用?

inline bool operator+= (double new_energy) { 
    mutex_.lock(); 
    energy += new_energy; 
    mutex_.unlock(); 
    return false; 
}; 
+0

你是否包含頭文件?你的編譯器知道在哪裏找到提升? – Jepessen

+0

您的'mutex_'是靜態的,但我沒有看到您定義它的位置。你真的只想要所有單元和所有檢測器只有一個互斥體? – qPCR4vir

+0

可能重複[什麼是未定義的引用/未解析的外部符號錯誤,以及如何解決它?](http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-符號錯誤和怎麼辦我修復) – Danh

回答

0

您已將mutex_定義爲類的靜態成員,這意味着它不是每個實例成員。因此你不能在構造函數中進行初始化。相反,它必須在源文件中初始化,在你的情況下最有可能是Detector.cpp

的初始化代碼應該是:

boost::mutex Detector::Cell::mutex_; 

如果你不希望它是一個靜態成員(您想每單元一個互斥體)取出static預選賽。

+0

謝謝你,我將靜態互斥對象改爲了一個指向互斥對象的指針,我在我的內聯Cell()函數中初始化了它,並且它似乎可行。 – Marie