Partilhar via


Compilador erro C2440

Mensagem de erro

'conversão de': não é possível converter de 'tipo' para 'type2'

O compilador não é possível converter de ' type1'para'type2'.

C2440 pode ocorrer sistema autônomo resultado de conformidade e o trabalho de atualização que foi concluído na biblioteca C++ padrão.Consulte Alterações de biblioteca C++ padrão: O Visual C++ .NET 2003 e Alterações de biblioteca nas versões do Visual C++ para mais informações.

Exemplo

C2440 pode ser causado se você tentar converter um ponteiro para o membro para void *.O exemplo a seguir gera 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);
   }
};

Os erros C2440 nas linhas de 15 e 16 da próxima amostra serão qualificados com o Incompatible calling conventions for UDT return value mensagem. (Um UDT é um tipo definido pelo usuário, sistema autônomo uma classe, struct ou união.) Esses tipos de erros de incompatibilidade são causados quando a convenção de chamada de um UDT especificada no tipo de retorno de uma declaração de reenvio conflitos com a convenção de chamada real de UDT e quando um ponteiro de função está envolvido.

No exemplo, primeiro precisamos encaminhar declarações para uma struct e para uma função que retorna o struct; o compilador pressupõe que a estrutura usa a convenção de chamada de C++.Em seguida, temos a definição de struct, que, por padrão, usa a convenção C de chamada.Visto que o compilador não sabe a convenção de chamada da estrutura até terminar de ler a estrutura inteira, a convenção de chamada para struct no tipo de retorno de get_c2 será também pressuposta ser C++.

O struct é seguido por outra declaração de função que retorna o struct, mas neste ponto, o compilador sabe que convenção de chamada do struct é C++.Da mesma forma, o ponteiro de função, que retorna o struct, é definido após a definição de struct para que o compilador sabe que a estrutura usa a convenção de chamada de C++.

Para resolver C2440 causa de convenções de chamada incompatíveis, declare funções que retornam um UDT após a definição de 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 também pode ocorrer se você atribuir zero a um ponteiro interior:

// 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 também pode ocorrer por um uso incorreto de uma conversão definida pelo usuário.Para obter mais informações sobre conversões definidas pelo usuário, consulte User-Defined Conversions). O exemplo a seguir gera 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 também pode ocorrer se você tentar criar uma instância de uma matriz do Visual C++ cujo tipo é um Array. Para obter mais informações, consulte matriz (Visual C++). O exemplo a seguir gera 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 também pode ocorrer devido às alterações no recurso de atributos.O exemplo a seguir gera C2440.

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

Este erro também pode ser gerado sistema autônomo resultado do compilador conformidade trabalho foi realizado em Visual C++ 2005: o compilador do Visual C++ não permite mais o const_cast Operador para baixo de conversão durante a compilação de código-fonte que usa programação CLR.

Para resolver este C2440, use o operador de conversão correto (para obter mais informações, consulte Projetando uma operadores). Consulte Quebrar alterações no compilador de 2005 Visual C++ para obter mais informações.

O exemplo a seguir gera 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 também pode ser gerada usando /clr:oldSyntax. O exemplo a seguir gera 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
}