Partage via


Avertissement du compilateur (niveau 2) C5046

'function' : symbole impliquant un type avec une liaison interne non définie

Notes

Le compilateur a détecté une utilisation d’une fonction qui n’a pas de définition, mais la signature de cette fonction implique des types qui ne sont pas visibles en dehors de cette unité de traduction. Étant donné que ces types ne sont pas visibles en externe, aucune autre unité de traduction ne peut fournir une définition pour cette fonction, de sorte que le programme ne peut pas être lié avec succès.

Les types qui ne sont pas visibles entre les unités de traduction sont les suivants :

  • Types déclarés à l’intérieur d’un espace de noms anonyme

  • Classes locales ou non nommées

  • Spécialisations de modèles qui utilisent ces types en tant qu’arguments de modèle.

Cet avertissement est nouveau dans Visual Studio 2017 version 15.8.

Exemple

Cet exemple montre deux avertissements 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.
}

Pour résoudre ces problèmes, définissez les fonctions dans ce fichier.