Im having troubles invoking a function by using function pointer declared as a member of a struct inside of a class In the master.cpp:
#include "headers/master.hh"
#include "headers/bus.hh"
#include <memory.h>
#include <stdint.h>
#include <iostream>
int main()
{
    int size = 4;
    Bus prova;
    int su = (prova.BIOS_ROM.*read_ptr)(prova.BIOS_ROM, size);
    printf("%p\n", (void *)prova.BIOS_ROM.read_ptr);
}
In the bus.hh file:
#ifndef BUS_H
#define BUS_H
#include <stdint.h>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <array>
class Bus
{
public:
    template <typename T> // T is the bit width of the bus
    struct bus_t
    {
        T bitfield;
        char r_perm : 3; // 8/16/32 bit read
        char w_perm : 3; // 8/16/32 bit read
        T (Bus::*read_ptr)(struct bus_t<T> bus, int size);
        void (Bus::*write_ptr)(struct bus_t<T> bus, int size, T data);
    };
    template <typename T>
    T read(struct bus_t<T> bus, int size);
    template <typename T>
    void write(struct bus_t<T> bus, int size, T data);
    struct bus_t<uint32_t> BIOS_ROM;
public:
    Bus();
    ~Bus();
};
#include "bus.tpp"
#endif /* !BUS_H */
bus.tpp file:
#pragma once
template <typename T>
T Bus::read(struct bus_t<T> bus, int size)
{
    printf("Bus.bitfield is %d\n", bus.bitfield);
    printf("Size is %d\n", size);
    return bus.bitfield >> size; // 10 0001 = 33
}
template uint32_t Bus::read(struct bus_t<uint32_t> bus, int size);
template <typename T>
void Bus::write(struct bus_t<T> bus, int size, T data)
{
    //read<uint32_t>(bus, size);
    bus.bitfield = data;
}
And in the bus.cpp file:
#include "headers/bus.hh"
Bus::Bus()
{
    BIOS_ROM.bitfield = 0;
    BIOS_ROM.r_perm = 7;
    BIOS_ROM.read_ptr = &Bus::read<uint32_t>;
    BIOS_ROM.write_ptr = &Bus::write<uint32_t>;
}
Bus::~Bus()
{
}
I really cant find where the problem lies. Im new to C++(Ive been mostly programming in java/c) so I dont exactly know how generics syntax work in C++
I've also tried taking a look at this thread Why can templates only be implemented in the header file? but I didnt actually understand what should I fix in my code in order to make it run
EDIT: While compiling with g++, it gives me the following error:
master.cpp:11:31: error: ‘read_ptr’ was not declared in this scope
   11 |     int su = (prova.BIOS_ROM.*read_ptr)(prova.BIOS_ROM, size);
 
    