problems with sending out midi data via struct

Hello,
according to this tutorial

Midi Tutorial

i want to send out midi data via struct. I think, i've done it all as it is explained in the tutorial, but when compiling i get the following error messages:

MICCA_0074:1368:26: error: variable or field 'serial_write_MIDICC' declared void
void serial_write_MIDICC(MIDI_message_3B &cc_msg) {
^
MICCA_0074:1368:26: error: 'MIDI_message_3B' was not declared in this scope
MICCA_0074:1368:43: error: 'cc_msg' was not declared in this scope
void serial_write_MIDICC(MIDI_message_3B &cc_msg) {

exit status 1
variable or field 'serial_write_MIDICC' declared void

This is my declaration part:

struct MIDI_message_3B {
    unsigned int ccChan : 4;         // second nibble : Midi channel (0-15)
    unsigned int ccStatus : 3;       // first nibble : status message CC = 0xB0
    unsigned int _msb0 : 1;         // most significant bit of status byte : should be 1 according to Midi specification
    unsigned int ccNo : 7;            // second byte   : first value
    unsigned int _msb1 : 1;         // most significant bit of first data byte : should be 0 according to Midi specification
    unsigned int ccVal : 7;           // third  byte   : second value
    unsigned int _msb2 : 1;         // most significant bit of second data byte : should be 0 according to Midi specification
    
    MIDI_message_3B(): _msb0(1), _msb1(0), _msb2(0) {}
};

MIDI_message_3B cc_msg;       // create a variable called 'cc_msg' of the 'MIDI_message_3B' type we just defined

The part which should send the midi cc-data out:

void serial_write_MIDICC(MIDI_message_3B &cc_msg) {
  Serial1.write((uint8_t *)&cc_msg, 3); 
}

void CCOUT(byte mdch, byte ccnumber, byte ccvalue) {
  cc_msg.ccStatus = 0xB0;     // control change
  cc_msg.ccChan = mdch;
  cc_msg.ccNo = ccnumber;
  cc_msg.ccVal = ccvalue;

  serial_write_MIDICC(cc_msg);
}

It very possible that i've overseen or misunderstood something.

This i definitely don't understand, i've never seen such a thing!? I think it sets the values of some parts of the struct, but why no semicolon?

MIDI_message_3B(): _msb0(1), _msb1(0), _msb2(0) {}

The second thing i don't understand is why in the original code alle struct values are declared as unsigned int, should'nt they be from type byte ?