https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105061
--- Comment #1 from Will Wray <wjwray at gmail dot com> --- Hmm, the accepted simplified version ^^^ with typename parameter removed is then rejected if 'unsigned' is replaced with 'uint32_t' from <cstdint> #include <cstdint> template <int width, int offset> struct uint_offset_bitfield { uint32_t : offset, field : width; }; | ^ | error: found ':' in nested-name-specifier, expected '::' | :: | error: invalid use of '::' (and "error: invalid use of '::'" is just wrong - no use of '::' at all)