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

Posted

技术标签:

【中文标题】带有模板类的赋值运算符 - 没有可接受的转换,C++【英文标题】:Assignment Operator with Template classes - no acceptable conversion, C++ 【发布时间】:2012-11-20 00:35:33 【问题描述】:

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

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)

我不确定我做错了什么!

编辑:包含完整模板

【问题讨论】:

如果您显示的内容在类声明中,则运算符中不需要&lt;T&gt; 返回本身不是重点,所以像 _incomingBuffer = _outgoingBuffer = _otherBuffer;工作吗? 是的,但是如果您的操作符在类声明中,并且假设该类是带有模板参数T 的模板,那么您不需要在操作符的返回中使用&lt;T&gt;。我并不是说它会解决问题。 哦!无论如何,这很有帮助。谢谢。 【参考方案1】:

问题可能出在这里:

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

【讨论】:

看来你的假设是正确的。至于解决方案,看起来还不止这些。

以上是关于带有模板类的赋值运算符 - 没有可接受的转换,C++的主要内容,如果未能解决你的问题,请参考以下文章

错误C2678:二进制'+':找不到运算符,它接受类型为'volatile A'的左手操作数(或者没有可接受的转换)

模板类的赋值运算符

模板类的重载赋值运算符

包含指向派生模板类的基类指针的类的赋值运算符和复制构造函数

重载 [] 和 = 运算符以在 C++ 中接受我的模板类的值

模板类复制内部类问题中的模板赋值运算符