Condividi tramite


Avviso del compilatore (livello 2) C4275

non - Classe di interfaccia DLL 'class_1' usata come base per la classe di interfaccia DLL 'class_2'

Una classe esportata è stata derivata da una classe che non è stata esportata.

Per ridurre al minimo la possibilità di danneggiamento dei dati durante l'esportazione di una classe con __declspec(dllexport), assicurarsi che:

  • Tutti i dati statici sono accessibili tramite funzioni esportate dalla DLL.

  • Nessun metodo inlined della classe può modificare i dati statici.

  • Nessun metodo inlined della classe usa funzioni CRT o altre funzioni di libreria che usano dati statici.

  • Nessuna funzione di classe inlined usa funzioni CRT o altre funzioni di libreria, in cui si accede ai dati statici.

  • Nessun metodo della classe (indipendentemente dall'inlining) può usare i tipi in cui la creazione di istanze nell'exe e la DLL presentano differenze di dati statici.

È possibile evitare di esportare classi definendo una DLL che definisce una classe con funzioni virtuali e funzioni che è possibile chiamare per creare un'istanza ed eliminare oggetti del tipo. È quindi possibile chiamare semplicemente le funzioni virtuali nel tipo .

C4275 può essere ignorato in Visual C++ se si deriva da un tipo nella libreria standard C++, compilando una versione di debug (/MTd) e dove il messaggio di errore del compilatore fa riferimento a _Container_base.

// C4275.cpp
// compile with: /EHsc /MTd /W2 /c
#include <vector>
using namespace std;
class Node;
class __declspec(dllimport) VecWrapper : vector<Node *> {};   // C4275