Símbolo externo não resolvido para campo de objeto estático
Este artigo investiga a mensagem de erro "erro LNK2001: símbolo externo não resolvido" encontrada ao tentar definir um campo estático em uma classe do método principal.
No trecho de código fornecido, a declaração do campo estático "a" na classe "B" ocorre dentro da própria definição da classe. Porém, de acordo com o padrão C, tais declarações não são consideradas definições. Para membros de dados estáticos, a definição adequada deve aparecer fora da classe no escopo do namespace envolvente, usando o operador "::".
A regra que rege esse requisito é conhecida como One Definition Rule (ODR), que determina que cada entidade (incluindo membros de dados estáticos) tenha uma definição única e exclusiva em todo o programa. Esta regra garante que não haja ambigüidade em relação ao valor do membro estático.
Portanto, para resolver o erro, o código deve ser modificado da seguinte forma, onde "a" é definido no escopo do namespace:
class A
{
public:
A()
{
}
};
class B
{
public:
static A* a;
};
A* B::a; // Definition in namespace scope
int main()
{
B::a = new A;
}
Ao definir explicitamente o membro estático fora da classe, o vinculador pode resolver corretamente a referência do símbolo e o código será compilado com sucesso.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3