Avviso del compilatore (livello 2) C5046

'function': simbolo che coinvolge il tipo con collegamento interno non definito

Osservazioni:

Il compilatore ha rilevato un uso di una funzione che non ha una definizione, ma la firma di questa funzione implica tipi non visibili all'esterno di questa unità di conversione. Poiché questi tipi non sono visibili esternamente, nessun'altra unità di conversione può fornire una definizione per questa funzione, quindi il programma non può essere collegato correttamente.

I tipi che non sono visibili tra le unità di conversione includono:

  • Tipi dichiarati all'interno di uno spazio dei nomi anonimo

  • Classi locali o senza nome

  • Specializzazioni di modelli che usano questi tipi come argomenti modello.

Questo avviso è una novità di Visual Studio 2017 versione 15.8.

Esempio

Questo esempio mostra due avvisi 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.
}

Per risolvere questi problemi, definire le funzioni in questo file.