Visibilidade de classes / estruturas de modelos particulares

Não entendo por que, no código a seguir, tenho permissão para criar a funçãoprint_private_template enquanto o compilador reclamaprint_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;
}

Esse é um comportamento esperado? um bug / extensão do compilador?

Só para esclarecer, meu objetivo é cometer o erro do compilador emambos o uso deprint_private_template eprint_private_class.

questionAnswers(2)

yourAnswerToTheQuestion