Неопределенная ссылка для boost::mutex в структуре
Я хочу использовать boost::mutex для добавления функции моей структуры Cell. Вот определение моей структуры в Detector.h
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;
}
И я использую мою функцию add в Detector.cpp для вектора Cell.
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;)?
inline bool operator+= (double new_energy) {
mutex_.lock();
energy += new_energy;
mutex_.unlock();
return false;
};
1 ответ
Вы определили mutex_
как статический член класса, что означает, что он не является членом для каждого экземпляра. Поэтому вы не можете инициализировать в конструкторе. Вместо этого он должен быть инициализирован в исходном файле, в вашем случае, скорее всего Detector.cpp
,
Код для инициализации должен быть:
boost::mutex Detector::Cell::mutex_;
Если вы не хотите, чтобы это был статический член (вы хотите один мьютекс на ячейку), удалите static
Классификатор.