E2015 'function1' と 'function2' の区別があいまいです(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(); }