コンパイラ エラー C2668

更新 : 2007 年 11 月

エラー メッセージ

'function' : オーバーロード関数の呼び出しを解決できません。

このオーバーロードされた関数の呼び出しは解決できません。1 つ以上の実パラメータを明示的にキャストすることもできます。

このエラーは、テンプレートを使用した場合にも発生することがあります。同じクラスにある標準のメンバ関数と template 宣言されたメンバ関数のシグネチャが同一の場合は、後者を先に指定する必要があります。Visual C++ の現在の実装では、この制限があります。

関数テンプレートの一部の順序付けの詳細については、Knowledge Base 文書の「BUG: C2667 and C2668 on Partial Ordering of Function Templates (Q240869)」を参照してください。

ISupportErrorInfo をサポートする COM オブジェクトを含む ATL プロジェクトをビルドする場合は、Knowledge Base 文書の「BUG: Error Message: C2668: InlineIsEqualGUID: Ambiguous Call to Overloaded Function (Q243298)」を参照してください。

使用例

次の例では C2668 エラーが生成されます。

// C2668.cpp
struct A {};
struct B : A {};
struct X {};
struct D : B, X {};

void func( X, X ){}
void func( A, B ){}
D d;
int main() {
   func( d, d );   // C2668 D has an A, B, and X 
   func( (X)d, (X)d );   // OK, uses func( X, X )
}

このエラーは、using 宣言を使用して解決することもできます。

// C2668b.cpp
// compile with: /EHsc /c
// C2668 expected
#include <iostream>
class TypeA {
public:
   TypeA(int value) {}
};

class TypeB {
   TypeB(int intValue);
   TypeB(double dbValue);
};

class TestCase {
public:
   void AssertEqual(long expected, long actual, std::string
                    conditionExpression = "");
};

class AppTestCase : public TestCase {
public:
   // Uncomment the following line to resolve.
   // using TestCase::AssertEqual;
   void AssertEqual(const TypeA expected, const TypeA actual,
                    std::string conditionExpression = "");
   void AssertEqual(const TypeB expected, const TypeB actual,
                    std::string conditionExpression = "");
};

class MyTestCase : public AppTestCase {
   void TestSomething() {
      int actual = 0;
      AssertEqual(0, actual, "Value");
   }
};

このエラーは、定数 0 のキャストであいまいな変換を行う Visual Studio .NET 2003 で行った、コンパイラ準拠作業の結果として生成されることもあります。

int は long と void* の両方への変換を必要とするため、定数 0 を使用したキャストでの変換はあいまいです。このエラーを解決するには、使用する関数パラメータの厳密な型に 0 をキャストし、変換の必要がなくなるようにします。このコードは、Visual Studio .NET 2003 と Visual Studio .NET の両方のバージョンの Visual C++ で有効です。

詳細については、「Summary of Compile-Time Breaking Changes」を参照してください。

// C2668c.cpp
#include "stdio.h"
void f(long) {
   printf_s("in f(long)\n");
}
void f(void*) {
   printf_s("in f(void*)\n");
}
int main() {
   f((int)0);   // C2668

   // OK
   f((long)0);
   f((void*)0);
}

CRT はすべての数値演算関数の浮動小数点数形式および倍精度浮動小数点数形式を持つため、このエラーが発生することがあります。

// C2668d.cpp
#include <math.h>
int main() {
   int i = 0;
   float f;
   f = cos(i);   // C2668
   f = cos((float)i);   // OK
}

pow(int, int) が CRT の math.h から削除されたため、このエラーが発生することがあります。

// C2668e.cpp
#include <math.h>
int main() {
   pow(9,9);   // C2668
   pow((double)9,9);   // OK
}