Share via


컴파일러 오류 C2440

업데이트: 2007년 11월

오류 메시지

'conversion' : 'type1'에서 'type2'(으)로 변환할 수 없습니다.
'conversion' : cannot convert from 'type1' to 'type2'

컴파일러가 'type1'에서 'type2'로 캐스팅할 수 없습니다.

C2440은 표준 C++ 라이브러리에서 수행한 규칙 및 업데이트 작업의 결과로 발생할 수 있습니다. 자세한 내용은 표준 C++ 라이브러리 변경 내용: Visual C++ .NET 2003Visual C++ 릴리스의 라이브러리 변경 내용을 참조하십시오.

예제

C2440은 멤버에 대한 포인터를 void*로 변환하려고 할 때 발생할 수 있습니다. 다음 샘플에서는 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는 클래스, 구조체 또는 공용 구조체와 같은 사용자 정의 형식입니다. 이러한 종류의 비호환 오류는 전방 선언의 반환 형식에 지정한 UDT의 호출 규칙이 UDT의 실제 호출 규칙과 충돌하는 경우 및 함수 포인터와 연관된 경우에 발생합니다.

예제에서는 struct를 반환하는 함수에 대해 그리고 struct에 대해 전방 선언을 사용하며, 컴파일러는 struct가 C++ 호출 규칙을 사용한다고 가정합니다. 그런 다음 기본적으로 C 호출 규칙을 사용하는 struct 정의를 사용합니다. 컴파일러는 전체 struct를 읽을 때까지 struct의 호출 규칙을 알지 못하므로 get_c2의 반환 형식에서 struct에 대한 호출 규칙은 C++로 간주됩니다.

struct 다음에는 struct를 반환하는 다른 함수 선언이 옵니다. 이때 컴파일러는 struct의 호출 규칙이 C++임을 알고 있습니다. 마찬가지로 struct를 반환하는 함수 포인터는 struct가 정의된 후에 정의되므로 컴파일러는 struct가 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은 내부 포인터에 0을 할당하는 경우에도 발생할 수 있습니다.

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

C2440은 해당 형식이 Array인 Visual C++ 배열의 인스턴스를 만들려는 경우에도 발생할 수 있습니다. 자세한 내용은 array를 참조하십시오. 다음 샘플에서는 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에서는 컴파일러 규칙에 따라 이제 /clr 프로그래밍을 사용하는 소스 코드를 컴파일할 때 const_cast Operator로 다운캐스팅할 수 없기 때문에 이 오류가 발생할 수도 있습니다.

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

C2440은 /clr:oldSyntax를 사용할 때도 발생할 수 있습니다. 다음 샘플에서는 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
}