Como a declaração antecipada não é necessária para o conceito de classe de amigo?

Eu aprendi recentemente sobrefriend class conceito em C ++ (eu pesquisei um pouco, mas esserespond me fez rir até me lembrar das partes mais importantes) e estou tentando incorporá-lo ao projeto em que estou trabalhando agora. A pergunta concisa é destacada no final, mas, em geral, estou confuso com falta completa de declarações avançadas no meu código de trabalho.

Todas as minhas aulas são separadas por (sub-) pastas e cada uma em um .h e .cpp, mas isso deve ser suficiente para ter uma idéia sobre as dependências:

// FE.h - no implementations - no .cpp file
class FE
{
    private:
       virtual void somePrivateFunc() = 0;
    // 90% virtual class, interface for further implementations
    friend class TLS;
};

// DummyFE.h
#include "FE.h"
class DummyFE :: public FE {
    /* singleton dummy */
    private:
        // constructor
    public:
        static DummyFE& instance();
};
// DummyFE.cpp
#include "DummyFE.h"
// all Dummy FE implementation

// ImplFE.h
#include "FE.h"
class ImplFE :: public FE { /* implemented */ };
// ImplFE.cpp
#include "FE.cpp"
// all Impl FE implementations


// SD.h - implements strategy design pattern
//        (real project has more than just FE class in here)
#include "FE.h"
#include "DummyFE.h"
class SD
{
    private:
        FE &localFE;
    public:
        SD(FE &paramFE = DummyFE::instance());
    // ... and all the other phun stuff ... 
    friend class TLS;
};
// SD.cpp - implementations
# include "SD.h"
/* SD implemented */

// TLS.h - implements strategy design pattern
           (on a higher level)
#include SD.h
class TLS{
    private:
        SD *subStrategy;
    public:
        void someFunctionRequiringFriendliness();
}

// TLS.cpp - implementations
#include "TLS.h"
void TLS::someFunctionRequiringFriendliness(){
    this->subStrategy->localFE.somePrivateFunc(); // ok!
}

Agora, eu tive parte para conseguir tudo isso para realmente compilar com todas as dependências (tive que anotá-lo em um diagrama de classe no final para fazê-lo funcionar), mas agora funciona. O fato de que é realmenteme confundind, é aquelenenhuma declaração avançada era necessária. Conheço as declarações de encaminhamento anteriores e, por precaução, atualizei minha memória comesta resposta.

ntão, para tentar mantê-lo clarminha pergunt: Ao declarar oclass TLS como amigo, por que não foram necessárias declarações avançadas explícitas? Isso significa que umfriend class declaração é uma declaração direta em si mesma? Para mim, intuitivamente, falta algo aqui ... E, como ele compila e funciona normalmente, alguém pode ajudar a corrigir minha intuição? : D

PS desculpe por uma introdução tão longa à pergunta e um monte de código. Por favor, não comente meu conceito de código - amigos são bons aqui, tenho certeza de que está correto para o meu projeto atual (é um pouco difícil de ver nesse esqueleto). Gostaria apenas de saber por que nenhuma declaração de encaminhamento foi necessária em qualquer luga

questionAnswers(8)

yourAnswerToTheQuestion