繁体   English   中英

C ++中带有模板初始化的静态结构指针

[英]static struct pointer with template initialization in C++

我正在实现一个简单的MemPool。 MemPool以LinkList的形式实现。 但我不知道宣布

static Node * free_mem_head;

正确地。

template <int PIECE_SIZE>
class mempool {
private:
    struct Node {
        Node * next;
        char p_mem[PIECE_SIZE];
    };

    const static size_t bunch_size = 50;
public:
    static Node * free_mem_head;
    mempool();
    ~mempool();

    void * allocate();
    void deallocate(void *);
};




template <int PIECE_SIZE>
mempool<PIECE_SIZE>::mempool() {}

template <int PIECE_SIZE>
mempool<PIECE_SIZE>::~mempool() {

}

template <int PIECE_SIZE>
void* mempool<PIECE_SIZE>::allocate() {
    if (free_mem_head == NULL) {
        size_t size_to_new = bunch_size * sizeof(Node);
        void *new_mem = ::operator new(size_to_new);
        free_mem_head = static_cast<Node*>(new_mem);

        for (int i = 0; i<bunch_size - 1; i++) {
            free_mem_head[i].next = &free_mem_head[i + 1];
        }
        free_mem_head[bunch_size - 1].next = NULL;

        Node *res = free_mem_head;
        free_mem_head = free_mem_head->next;
    }
    else {
        Node * res = free_mem_head;
        free_mem_head = free_mem_head->next;
        return res;
    }
}

template <int PIECE_SIZE>
void  mempool<PIECE_SIZE>::deallocate(void * node_to_free) {
    Node * p = static_cast<Node*> (node_to_free);
    p->next = free_mem_head;
    p = free_mem_head;
}

这就是我的使用方式:

#include <cstring>

class Test {
public:
    Test(int a, int b) :a(a), b(b) {
        strncpy(c, "abc", 3);
        c[3] = 0;
    }
    int a;
    double b;
    char c[100];
private:
    void *operator new(size_t s1);
    void operator delete(void *);
};

class Node;
mempool<sizeof(Test)> mempool1;
Node * mempool<sizeof(Test)>::free_mem_head = NULL;
void * Test::operator new(size_t s1) {
    return mempool1.allocate();
}

void Test::operator delete(void *p) {
    mempool1.deallocate(p);
    return;
}

它出现了编译错误:错误:专门成员'mempool <120> :: free_mem_head'需要'template <>'语法Node * mempool :: free_mem_head = NULL;

您应该定义free_mem_head而不进行专门化:

template<int PIECE_SIZE>
typename mempool<PIECE_SIZE>::Node * mempool<PIECE_SIZE>::free_mem_head{};

使用C ++ 17可以在模板本身内部定义:

static inline Node * free_mem_head{};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM