Undefined reference в классе с Template

202
15 января 2020, 11:50

Allocator.pro

TEMPLATE = app
CONFIG += console c++17
CONFIG -= app_bundle
CONFIG -= qt
SOURCES += \
        main.cpp \
    allocuser.cpp
HEADERS += \
    allocuser.h

allocuser.h

#ifndef ALLOCUSER_H
#define ALLOCUSER_H
#include <bitset>
using namespace std;
class AllocUser
{
private:
public:
    AllocUser();
    const static int maxItem = 1000;
    const static int maxSize = 32;
    static std::bitset<maxItem> bufmap;
    static inline char buf[maxItem * maxSize];
    static int freeblock;
    template <typename T>
        static T *allocate(void) {
                int i;
                static_assert( sizeof(T) < AllocUser::maxSize, "Max size for this allocator excessed " );
                    for(i=AllocUser::freeblock; i<AllocUser::maxItem; i++) {
                            if( !AllocUser::bufmap.test(i) )
                                break;
                }
                if( i==AllocUser::maxItem ) throw new bad_alloc();
                AllocUser::bufmap.set(i, true);
                AllocUser::freeblock=i+1;
                return static_cast<T*> (new (&buf[AllocUser::maxSize*i]) T());
        }
    template <typename T>
        static void deallocate(T *ptr) {
                int i = ( ((char*)ptr)-&buf[0] )/maxSize;
  //              if( !bufmap.test(i) ) throw new logic_error("Wrong deallocate");
                ptr->~T();
                bufmap.set(i, false);
                if( freeblock > i ) freeblock=i;
        }
};
#endif // ALLOCUSER_H

allocuser.cpp

#include "allocuser.h"
using namespace std;
AllocUser::AllocUser()
{
std::bitset<maxItem> bufmap;
}

main.cpp

#include <iostream>
#include <allocuser.h>
#define MAX_SZ 32
#define MAX_ITEM 1000
using namespace std;
int AllocUser::freeblock=0;
int main()
{
    cout << "Hello World!" << endl;
 //   AllocUser *allocu = new AllocUser ();
  //  int allocu->freeblock=0;
    for(long i=0; i<1000; i++) {
        for(int j=0; j<3; j++){
            int *a = AllocUser::allocate<int>();
            *a=5;
            AllocUser::deallocate( a );
        }
    }
    return 0;
}
Answer 1

Не вижу никакого отношения к какому-то "Template" - ваш класс шаблонным не является. Как обычно в большинстве таких случаев, в вашем коде нет определения std::bitset<maxItem> bufmap;.

Либо добавьте определение в .cpp файле

std::bitset<maxItem> AllocUser::bufmap;

Либо (более простой вариант исправления) - прямо в определении класса сделайте

static inline std::bitset<maxItem> bufmap;

То же относится и ко всем остальным статическим полям, кроме, возможно, const int полей.

Также не ясно, зачем вы применяете static_cast<T*> к указателю, который и так уже имеет тип T *.

READ ALSO
libssh2 и Channel open failure (connect failed)

libssh2 и Channel open failure (connect failed)

При попытке создать канал как

171
std::vector указателей долго освобождает память

std::vector указателей долго освобождает память

Я считываю много данных из файла и заполняю ими вектор (про резервирование вектора знаю)После некоторых манипуляций с данными, я освобождаю...

191
регулярные выражения std::regex

регулярные выражения std::regex

Есть строка такого типа:

206
Проблема при добавлении в конец double linked list, C++

Проблема при добавлении в конец double linked list, C++

Есть два класса: первый - Game, второй - List (он же double listed list)

196