E2015 'function1' と 'function2' の区別があいまいです(C++)

提供: RAD Studio
移動先: 案内検索

コンパイラのエラーと警告(C++):インデックス への移動

呼び出されている関数をコンパイラが区別できません。 以下では、その考えられる原因と解決策について論じます。

オーバーロードされた関数のあいまいさ

関数がオーバーロード(多重定義)されており、入力されたパラメータで使用できる関数定義が複数存在する場合、このエラーが出力されます。 このようなあいまいさを解決するには、呼び出されている関数をコンパイラが識別できるようにパラメータの型を修正します。

例:

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

コンストラクタや変換演算子のあいまいさ

explicit キーワードを使ってコンストラクタや演算子を明示することが 1 つの取り得る解決策です。

例:

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

名前空間名やユニット スコープ名のあいまいさ

関数が、同時に使用される異なる名前空間で宣言されている場合は、あいまいさが生じます。 このようなあいまいさを解決するには、呼び出される関数の名前空間を指定します (「スコープ解決演算子」および「ユニット スコープ名」を参照。)

例:

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

例:

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

Printer という名前空間と関数がどちらもスコープ内に存在するため、これは "設計どおり" の動作です。 ソースを修正するには、次のように記述します。

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

例:

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

関連項目