OpaqueCBlocks are pretty opaque! I could never find an explanation.
First I tried leaving the declaration as OpaqueCBlock which compiled but resulted in a fatal runtime error. My approach was then to consider an OpaqueCBlock to be an opaque pointer to a cblock: ie a data type declared to be a pointer to an unspecified code block. My code then compiled, did not suffer from a runtime error and the program worked as expected.
Of course my explanation/understanding may be completely wrong (bear in mind that I have three law degrees and no programming qualifications).