Неопределенная ссылка для 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 Классификатор.

Другие вопросы по тегам