共用方式為


編譯器錯誤 C2440

更新:2007 年 11 月

錯誤訊息

conversion' : 無法從 'type1' 轉換為 'type2'

編譯器無法從 'type1' 轉換為 'type2'。

由於在 Standard C++ 程式庫中所執行的一致性和更新工作,結果可能會發生 C2440。如需詳細資訊,請參閱 Standard C++ 程式庫變更:Visual C++ .NET 2003Visual C++ 版本的程式庫變更

範例

如果嘗試將指標轉換為 void* 成員,可能會造成 C2440 錯誤。下列範例會產生 C2440。

// C2440.cpp
class B {
public:
   void  f(){;}

   typedef void (B::*pf)();

   void f2(pf pf) {
       (this->*pf)();
       void* pp = (void*)pf;   // C2440
   }

   void f3() {
      f2(f);
   }
};

以下範例程式碼中 15 和 16 行上的 C2440 錯誤將以 Incompatible calling conventions for UDT return value 訊息描述 (UDT 是使用者定義的型別,例如類別、結構或等位)。這些不相容錯誤發生的原因是:順向宣告 (Forward Declaration) 的傳回型別中所指定 UDT 呼叫慣例與實際的 UDT 呼叫慣例產生衝突,以及牽涉到函式指標。

在此範例中,我們先順向宣告了一個結構和一個傳回該結構的函式;編譯器會假設該結構使用 C++ 呼叫慣例。然後在預設狀態下,我們的結構定義使用了 C 的呼叫慣例。因為編譯器必須等到讀完整個結構之後才知道結構的呼叫慣例,因此對於 get_c2 傳回型別的結構,其呼叫慣例也將假設為 C++。

結構之後是另一個傳回該結構的函式宣告,但此時編譯器已知道該結構的呼叫慣例為 C++。同樣地,傳回該結構的函式指標亦定義於結構定義之後,因此編譯器知道該結構使用 C++ 的呼叫慣例。

若要解決由不相容呼叫慣例所引起的 C2440,請在 UDT 定義之後宣告傳回 UDT 的函式。

// C2440b.cpp
struct MyStruct;

MyStruct get_c1();

struct MyStruct {
   int i;
   static MyStruct get_C2();
};

MyStruct get_C3();

typedef MyStruct (*FC)();

FC fc1 = &get_c1;   // C2440, line 15
FC fc2 = &MyStruct::get_C2;   // C2440, line 16
FC fc3 = &get_C3;

class CMyClass {
public:
   explicit CMyClass( int iBar)
      throw()   {
   }

   static CMyClass get_c2();
};

int main() {
   CMyClass myclass = 2;   // C2440
   // try one of the following
   // CMyClass myclass(2);
   // CMyClass myclass = (CMyClass)2;

   int *i;
   float j;
   j = (float)i;   // C2440, cannot cast from pointer to int to float
}

如果指定零給內部指標,也可能會發生 C2440:

// C2440c.cpp
// compile with: /clr
int main() {
   array<int>^ arr = gcnew array<int>(100);
   interior_ptr<int> ipi = &arr[0];
   ipi = 0;   // C2440
   ipi = nullptr;   // OK
}

使用者定義轉換使用不正確,也可能會發生 C2440。如需使用者定義轉換的詳細資訊,請參閱User-Defined Conversions。下列範例會產生 C2440。

// C2440d.cpp
// compile with: /clr
value struct MyDouble {
   double d;
   // convert MyDouble to Int32
   static explicit operator System::Int32 ( MyDouble val ) {
      return (int)val.d;
   }
};

int main() {
   MyDouble d;
   int i;
   i = d;   // C2440
   // Uncomment the following line to resolve.
   // i = static_cast<int>(d);
}

如果嘗試建立型別為 Array 之 Visual C++ 陣列的執行個體,也可能會發生 C2440。如需詳細資訊,請參閱array (Visual C++)。下列範例會產生 C2440。

// C2440e.cpp
// compile with: /clr
using namespace System;
int main() {
   array<int>^ intArray = Array::CreateInstance(__typeof(int), 1);   // C2440
   // try the following line instead
   // array<int>^ intArray = safe_cast<array<int> ^>(Array::CreateInstance(__typeof(int), 1));
}

C2440 也可能會因為屬性功能變更而發生。下列範例會產生 C2440。

// c2440f.cpp
// compile with: /LD
[ module(name="PropDemoLib", version=1.0) ];   // C2440
// try the following line instead
// [ module(name="PropDemoLib", version="1.0") ];

對 Visual C++ 2005 編譯器完成一致性處理後也可能會產生這項錯誤:Visual C++ 編譯器不再允許 const_cast Operator編譯使用 /clr 進行程式設計的原始程式碼時向下轉換 (Down Cast)。

若要解決這項 C2440 錯誤,請使用正確的轉型運算子 (如需詳細資訊,請參閱Casting Operators)。如需詳細資訊,請參閱Visual C++ 2005 編譯器的重大變更

下列範例會產生 C2440。

// c2440g.cpp
// compile with: /clr
ref class Base {};
ref class Derived : public Base {};
int main() {
   Derived ^d = gcnew Derived;
   Base ^b = d;
   d = const_cast<Derived^>(b);   // C2440
   d = dynamic_cast<Derived^>(b);   // OK
}

使用 /clr:oldSyntax 也可以產生 C2440。下列範例會產生 C2440:

// c2440h.cpp
// compile with: /clr:oldSyntax
__gc class Base {};
__gc class Derived : public Base {};
int main() {
   Derived *d = new Derived;
   Base *b = d;
   d = const_cast<Derived*>(b);   // C2440
   d = dynamic_cast<Derived*>(b);   // OK
}