Partilhar via


Aviso do compilador (nível 2) C5046

'function': símbolo que envolve o tipo com vínculo interno não definido

Comentários

O compilador detectou um uso de uma função que não tem uma definição, mas a assinatura dessa função envolve tipos que não estão visíveis fora dessa unidade de tradução. Como esses tipos não são externamente visíveis, nenhuma outra unidade de tradução pode fornecer uma definição para essa função, portanto, o programa não pode ser vinculado com êxito.

Os tipos que não são visíveis entre unidades de tradução incluem:

  • Tipos declarados dentro de um namespace anônimo

  • Classes locais ou sem nome

  • Especializações de modelos que usam esses tipos como argumentos de modelo.

Este aviso é novo no Visual Studio 2017 versão 15.8.

Exemplo

Este exemplo mostra dois avisos C5046:

// C5046p.cpp
// compile with: cl /c /W2 C5046p.cpp

namespace {
    struct S {
        // S::f is inside an anonymous namespace and cannot be defined outside
        // of this file. If used, it must be defined somewhere in this file.
        int f();
    };
}

// g has a pointer to an unnamed struct as a parameter type. This type is
// distinct from any similar type declared in other files, so this function
// cannot be defined in any other file.
// Note that if the struct was declared "typedef struct { int x; int y; } S, *PS;"
// it would have a "typedef name for linkage purposes" and g could be defined
// in another file that provides a compatible definition for S.

typedef struct { int x; int y; } *PS;
int g(PS p);

int main()
{
    S s;
    s.f();      // C5046 f is undefined and can't be defined in another file.
    g(nullptr); // C5046 g is undefined and can't be defined in another file.
}

Para corrigir esses problemas, defina as funções neste arquivo.