E2015 Mehrdeutigkeit zwischen 'funktion1' und 'funktion2' (C++)

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Compiler-Fehler und -Warnungen (C++) - Index

Der Compiler kann nicht feststellen, welche Funktion aufgerufen wurde. Die möglichen Ursachen und Lösungen werden im Folgenden erläutert.

Mehrdeutigkeit bei überladenen Funktionen

Dieser Fehler wird ausgegeben, wenn die Funktionen überladen sind und mehr als eine Funktionsdefinition mit den angegebenen Parametern verwendet werden kann. Ändern Sie zum Auflösen der Mehrdeutigkeit den Typ der Parameter, damit die aufgerufene Funktion vom Compiler ermittelt werden kann.

Beispiel:

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

Mehrdeutigkeit bei Konstruktoren oder Konvertierungsoperatoren

Eine mögliche Lösung ist, den Konstruktor und/oder Operator mit dem Schlüsselwort explicit zu verwenden.

Beispiel:

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)
}

Mehrdeutigkeit bei Namespaces oder Unit-Gültigkeitsbereichsnamen

Die Mehrdeutigkeit entsteht, wenn die Funktionen in unterschiedlichen, gleichzeitig verwendeten Namespaces deklariert sind. Geben Sie zur Auflösung dieser Mehrdeutigkeit den Namespace der aufzurufenden Funktion an. (Siehe Zugriffsbereichsoperator und Unit-Gültigkeitsbereichsnamen.)

Beispiel:

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

Beispiel:

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

Diese Fehlermeldung ist erwünscht ("As Designed"), weil es in dem Gültigkeitsbreich sowohl einen Namespace als auch eine Funktion namens Printer gibt. Zur Korrektur des Quellcodes sollten Sie Folgendes angeben:

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

Beispiel:

	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();
	}

Siehe auch