Erreur du compilateur C2872
'symbol' : symbole ambigu
Le compilateur ne peut pas déterminer le symbole auquel vous faites référence. Plusieurs symboles portant le nom spécifié sont dans l’étendue. Consultez les notes suivantes le message d’erreur pour les emplacements et déclarations du fichier trouvés par le compilateur pour le symbole ambigu. Pour résoudre ce problème, vous pouvez qualifier entièrement le symbole ambigu en utilisant son espace de noms, par exemple, std::byte
ou ::byte
. Vous pouvez également utiliser un alias d’espace de noms pour donner à un espace de noms inclus un nom court pratique à utiliser lors de l’ambiguïté des symboles dans votre code source.
C2872 peut se produire si un fichier d’en-tête inclut une directive using et qu’un fichier d’en-tête suivant est inclus qui contient un type qui se trouve également dans l’espace de noms spécifié dans la using
directive. Spécifiez une using
directive uniquement une fois que tous vos fichiers d’en-tête sont spécifiés avec #include
.
C2872 peut se produire dans Visual Studio 2013 en raison d’un conflit entre le Windows::Foundation::Metadata::Platform
type d’énumération et l’espace de noms défini par Platform
C++/CX. Pour contourner ce problème, procédez comme suit :
Supprimez la clause « using namespace Windows ::Foundation ::Metadata » des fichiers projet.
Spécifiez le nom complet de n’importe quel type inclus dans cet espace de noms.
Exemple
L’exemple suivant génère l’erreur C2872, car une référence ambiguë est faite à une variable nommée i
; deux variables portant le même nom sont dans l’étendue :
// C2872.cpp
// compile with: cl /EHsc C2872.cpp
namespace A {
int i;
}
using namespace A;
int i;
int main() {
::i++; // ok, uses i from global namespace
A::i++; // ok, uses i from namespace A
i++; // C2872 ambiguous: ::i or A::i?
// To fix this issue, use the fully qualified name
// for the intended variable.
}