Как объявить шаблонную структуру / класс своим другом?

Я хотел бы сделать следующее:

template <typename T>
struct foo
{
    template <typename S>
    friend struct foo<S>;

private:
    // ...
};

но мой компилятор (VC8) подавился этим:

error C3857: 'foo<T>': multiple template parameter lists are not allowed

Я хотел бы иметь все возможные экземплярыtemplate struct foo друзьяfoo<T> для всехT.

Как мне сделать эту работу?

РЕДАКТИРОВАТЬ: Это

template <typename T>
struct foo
{
    template <typename>
    friend struct foo;

private:
    // ...
};

похоже компилируется, но правильно ли это? Друзья и шаблоны имеют очень неестественный синтаксис.

Ответы на вопрос(1)

Ваш ответ на вопрос