0

スレッド ローカル ポインターを表すテンプレート クラスを作成します。

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)

何が間違っているのかわからない!

編集:完全なテンプレートが含まれています

4

1 に答える 1

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) { .... } 
于 2012-12-02T10:02:25.733 に答える