You do not need the first template<>in your partial specialization test<C<D>>. Moreover, you can only partially specialize class templates, not function templates. Maybe something like this:
template <class X>
struct thing
{
static void test() { cout << "This is a test" << endl;}
};
template <int D>
struct thing<C<D>>
{
static void test() {cout << C<D>::foo() << endl;}
};
, , :
template <class X>
void test(const X&) { cout << "This is a test" << endl;}
template <int D>
void test(const C<D>&) {cout << C<D>::foo() << endl;}
test(3);
test(C<3>());