具有模板类的赋值运算符 - 没有可接受的转换,C ++

时间:2012-12-02 09:44:51

标签: c++ templates assignment-operator

我构建了一个模板类,它应该代表一个线程局部指针。

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)

我不确定我做错了什么!

编辑:包含完整模板

1 个答案:

答案 0 :(得分:3)

问题可能出在这里:

ThreadLocalPointer<PacketClientHeader*> _incomingBuffer;

模板参数TPacketClientHeader*,此处为:

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) { .... }