A reference should be forward reference-able. That is, one should be able to create a reference to a class that is forward referenced. I think the "problem" here is the template. In order to create an object of a templated type, many compilers want to know the innards of the passed-in type(s) (i.e. the template types). What I suspect has happened here is that your Intel compiler has attempted to early-resolve the type T in the 'CBDCachedAllocator' type, and finding it forward-referenced short cut the process by (perhpas temporarily?) resolving it as void. This dodge might actually work most of the time...until you try to create a reference to the type, at which point the more sane part of the compiler rises up and smites you. A proper template implementation would attempt to forward-ref the templated type until class T could be resolved.

So in answer to your question, the construct as presented shoupd be syntactically correct (so long as the full definition of 'Section' is visible before the end of the compilation unit).