Я создаю шаблонный класс, который должен представлять локальный указатель потока.
template <class T>
class ThreadLocalPointer {
public:
T& operator*() {
return *_map[std::this_thread::get_id()];
}
T* operator->() {
return _map[std::this_thread::get_id()];
}
ThreadLocalPointer<T>& operator=(const T* right) {
_map[std::this_thread::get_id()] = right;
return *this;
}
T* get() {
return _map[std::this_thread::get_id()];
}
private:
std::unordered_map<std::thread::id, T*> _map;
};
Экземпляр класса:
ThreadLocalPointer<PacketClientHeader*> _incomingBuffer;
И, наконец, где я хочу использовать свой оператор присваивания
_incomingBuffer = (PacketClientHeader*)malloc(MAX_DATAGRAM_SIZE);
Код не скомпилируется:
no operator found which takes a right-hand operand of type 'PacketClientHeader *' (or there is no acceptable conversion)
Я не уверен, что я делаю неправильно!
Изменить: включен полный шаблон
Проблема может быть в том, что здесь:
ThreadLocalPointer<PacketClientHeader*> _incomingBuffer;
аргумент шаблона T
является PacketClientHeader*
, и здесь:
ThreadLocalPointer<T>& operator=(const T* right) { .... }
ваш оператор принимает const T*
, который разрешит const PacketClientHeader**
, Затем вы пытаетесь назначить из PacketClientHeader*
Вот:
_incomingBuffer = (PacketClientHeader*)malloc(MAX_DATAGRAM_SIZE);
и подходящего оператора не найдено. Не зная больше деталей о классе, трудно предложить решение, но это может быть так же просто, как использовать
ThreadLocalPointer<PacketClientHeader> _incomingBuffer;
или объявив оператор присваивания как
ThreadLocalPointer& operator=(const T& right) { .... }
Других решений пока нет …