Não é possível definir o valor do campo de object estático (erro LNK2001: símbolo externo não resolvido)

Eu tenho um segmento de código aparentemente simples e direto que é uma versão simplificada de um problema que tenho tido em um jogo que estou escrevendo. Eu estou tentando definir um campo estático em uma class para outro valor do meu método principal. No entanto este código não vai e eu não entendo o porquê.

Eu recebo o erro

1> Source.obj: erro LNK2001: símbolo externo não resolvido “public: class estática A * B :: a” (? A @ B @@ 2PAVA @@ A)

class A { public: A() { } }; class B { public: static A* a; }; int main() { B::a = new A; } 

Qual é a regra dizendo que tenho que definir meu membro de class estático fora da class para obtê-lo vinculado?

A partir do seu comentário

mas qual é a regra que define isso?

A partir da referência c ++ diz

Definições e ODR

Definições são declarações que definem totalmente a entidade introduzida pela declaração. Cada declaração é uma definição, exceto pelo seguinte:

4) Declaração de um membro de dados estáticos dentro de uma definição de class

 struct S { // defines S int n; // defines S::n static int i; // declares, but doesn't define S::i }; int S::i = 0; // defines and initializes S::i 

Como referência adicional, você também pode verificar aqui Wikipedia, Regra de Uma Definição

ATUALIZAR:
Eu finalmente encontrei a mais recente referência padrão disponível (2 de junho de 2014) (uma cópia do padrão liberado atualmente está disponível por cerca de 30 $ eu acho):

§ 9.4.2

2 A declaração de um membro de dados estático em sua definição de class não é uma definição e pode ser de um tipo incompleto diferente de cv-quali fi cado nulo. A definição de um membro de dados estático deve aparecer em um escopo de espaço de nomes abrangendo a definição de class do membro. Na definição no escopo do namespace, o nome do membro de dados estáticos deve ser qualificado por seu nome de class usando o operador ::. A expressão inicializadora na definição de um membro de dados estáticos está no escopo de sua class

Você não definiu o membro de dados estáticos. Você só declarou isso na definição de class. Adicione a seguinte linha

 A * B::a; 

antes do principal.

Ou você pode inicializá-lo usando o operador new.

 A * B::a = new A; 

Quanto à sua pergunta

Qual é a regra dizendo que tenho que definir meu membro de class estático fora da class para obtê-lo vinculado?

então, de acordo com o parágrafo 2 da seção 9.4.2 Membros de dados estáticos do Padrão C ++

2 A declaração de um membro de dados estático em sua definição de class não é uma definição e pode ser de um tipo incompleto diferente de void cv-qualificado. A definição para um membro de dados estático deve aparecer em um escopo de namespace, incluindo a definição de class do membro.