Eu escolho Num.3 (também conhecido como a versão detalhada). É mais digitação, mas a intenção é exata para você e para o compilador. O problema que você postou no estado em que se encontra é, na verdade, mais simples do que o mundo real. No mundo real, existem outros escopos de definições, não apenas os membros da classe. Suas definições não são muito complicadas apenas com classes - porque seu escopo nunca é reaberto (ao contrário de namespaces, escopo global, etc.).
Num.1 isso pode falhar com escopos diferentes de classes - qualquer coisa que possa ser reaberta. Portanto, você pode declarar uma nova função em um namespace usando essa abordagem, ou seus inlines podem acabar sendo substituídos via ODR. Você precisará disso para algumas definições (notadamente, especializações de modelo).
Num.2 Isso é muito frágil, particularmente em grandes bases de código - conforme os cabeçalhos e dependências mudam, seu programa irá falhar ao compilar.
Num.3 Isso é ideal, mas muito para digitar - qual sua intenção é definir algo . Isso faz exatamente isso, e o compilador entra em ação para garantir que você não cometeu um erro, uma definição não está fora de sincronia com sua declaração, etc.