E2015 Ambiguïté entre 'fonction1' et 'fonction2' (C++)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Erreurs et avertissements du compilateur (C++) - Index

Le compilateur ne peut pas distinguer quelle fonction a été appelée. Les causes possibles et les solutions sont traitées dans cette rubrique :

Fonctions surchargées ambiguës

Si les fonctions sont surchargées et que plusieurs définitions de fonction peuvent être utilisées avec les paramètres fournis, cette erreur est émise. Pour résoudre l'ambiguïté, modifiez le type des paramètres afin que le compilateur puisse identifier la fonction appelée.

Exemple :

void foo(short); // #1
void foo(char);  // #2
int I;
foo(i);          // error: ambiguous
foo((char)i);    // picks #2

Opérateurs de conversion ou constructeurs ambigus

Une solution possible consiste à rendre explicite le constructeur et/ou l'opérateur en utilisant le mot clé explicit.

Exemple :

struct A {
   A(const A&);
   A(const wchar_t*);
};
struct B {
   operator A();
   explicit  operator wchar_t*();
};  
int main() {
   B v;
   A s(v); // ok (since operator wchar is explicit)
}

Noms de portées d'unités ou espaces de nommage ambigus

L'ambiguïté a lieu si les fonctions sont déclarées dans différents espaces de nommage utilisés simultanément. Pour résoudre l'ambiguïté, spécifiez l'espace de nommage de la fonction à appeler. Voir les rubriques Opérateur de résolution de portée et Noms de portées d'unités.

Exemple :

struct A { void foo(); }; // #1 
struct B { void foo(); }; // #2
struct C : A, B  {
  void callfoo() {
      foo(); //error:  ambiguous
      B::foo(); // picks #2
    }
};

Exemple :

[BCC32 Error] Unit4.cpp(19): E2015 Ambiguity between '_fastcall Fmx::Printer::Printer()' and 'Fmx::Printer'

C'est "As Designed" car un espace de nommage et une fonction sont nommés Printer dans la portée. Pour corriger le source, vous devez écrire :

	void __fastcall TForm4::FormCreate(TObject *Sender)
	{ 
		Fmx::Printer::Printer()->BeginDoc();
	}

Exemple :

	namespace Ns {
		namespace Foo {
			void Foo() {}
		}
	}

	Using namespace Ns::Foo;
	Using namespace Ns;

	void Bar {
		Foo();	// error!  Which Foo?
				// should instead be Ns::Foo::Foo();
	}

Voir aussi