Visibilidad de clases / estructuras de plantillas privadas

No entiendo por qué en el siguiente código, puedo crear la funciónprint_private_template mientras el compilador se queja deprint_private_class:

#include <cstdio>

class A
{
    private:
        template <unsigned T>
        struct B
        {

        };

        struct C
        {

        };

    public:
        template <unsigned T>
        B<T> getAb()
        { 
            return B<T>();
        }

        C getAc()
        { 
            return C();
        }
};

template<unsigned T>
void print_private_template(const A::B<T> &ab)
{
    printf("%d\n", T);
}

void print_private_class(const A::C &ac)
{
    printf("something\n");
}

int main(int, char**)
{
    A a;

    print_private_template(a.getAb<42>());

    print_private_class(a.getAc());

    return 0;
}

¿Es este un comportamiento esperado? un error / extensión del compilador?

Para ser claros, mi objetivo es hacer que el error del compilador enambos el uso deprint_private_template yprint_private_class.

Respuestas a la pregunta(2)

Su respuesta a la pregunta