2016-11-11 85 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