コンパイラ エラー C2666
更新 : 2007 年 11 月
エラー メッセージ
'identifier' : number のオーバーロード関数があいまいです。
オーバーロードされた関数または演算子があいまいです。仮パラメータ リストが類似しすぎているため、コンパイラがあいまいさを解決できない可能性があります。このエラーを解決するには、1 つ以上の実パラメータを明示的にキャストします。
次の例では C2666 エラーが生成されます。
// C2666.cpp
struct complex {
complex(double);
};
void h(int,complex);
void h(double, double);
int main() {
h(3,4); // C2666
}
このエラーは、次の Visual Studio .NET 2003 で行ったコンパイラ準拠作業の結果として生成されることもあります。
二項演算子でのポインタ型へのユーザー定義変換
修飾変換は ID 変換と異なる
現在、二項演算子 <、>、<=、および >= では、オペランドの型に変換するユーザー定義変換演算子がパラメータの型で定義されている場合、渡されるパラメータは暗黙的にオペランドの型に変換されます。この場合、あいまいな可能性があります。
詳細については、「Summary of Compile-Time Breaking Changes」を参照してください。
Visual Studio .NET 2003 と Visual Studio .NET の両方のバージョンの Visual C++ で有効なコードを作成するには、関数構文を明示的に使用してクラス演算子を呼び出します。
使用例
// C2666b.cpp
#include <string.h>
#include <stdio.h>
struct T
{
T( const T& copy )
{
m_str = copy.m_str;
}
T( const char* str )
{
int iSize = (strlen( str )+ 1);
m_str = new char[ iSize ];
if (m_str)
strcpy_s( m_str, iSize, str );
}
bool operator<( const T& RHS )
{
return m_str < RHS.m_str;
}
operator char*() const
{
return m_str;
}
char* m_str;
};
int main()
{
T str1( "ABCD" );
const char* str2 = "DEFG";
// Error – Ambiguous call to operator<()
// Trying to convert str1 to char* and then call
// operator<( const char*, const char* )?
// OR
// trying to convert str2 to T and then call
// T::operator<( const T& )?
if( str1 < str2 ) // C2666
if ( str1.operator < ( str2 ) ) // Treat str2 as type T
printf_s("str1.operator < ( str2 )\n");
if ( str1.operator char*() < str2 ) // Treat str1 as type char*
printf_s("str1.operator char*() < str2\n");
}
次の例では C2666 エラーが生成されます。
// C2666c.cpp
// compile with: /c
enum E
{
E_A, E_B
};
class A
{
int h(const E e) const {return 0; }
int h(const int i) { return 1; }
// Uncomment the following line to resolve.
// int h(const E e) { return 0; }
void Test()
{
h(E_A); // C2666
h((const int) E_A);
h((int) E_A);
}
};