Compartir a través de


Error del compilador C3918

el uso requiere que 'miembro' sea un miembro de datos

El error C3918 puede producirse por varios motivos relacionados con eventos.

Ejemplos

El error C3918 puede producirse porque se requiere un miembro de clase en el contexto actual. El ejemplo siguiente genera el error C3918.

// C3918.cpp
// compile with: /clr /c
public ref class C {
public:
   System::Object ^ o;
   delegate void Del();

   event Del^ MyEvent {
      void add(Del^ev) {
         if ( MyEvent != nullptr) {}   // C3918
         if ( o != nullptr) {}   // OK
   }
   void remove(Del^){}
   }
};

El error C3918 también se produce si intenta comprobar un evento trivial para null (el nombre del evento ya no proporciona acceso directo al delegado de la memoria auxiliar del evento).

El ejemplo siguiente genera el error C3918.

// C3918_2.cpp
// compile with: /clr /c
using namespace System;
public delegate int MyDel(int);

interface struct IEFace {
   event MyDel ^ E;
};

ref struct EventSource : public IEFace {
   virtual event MyDel ^ E;
   void Fire_E(int i) {
      if (E)   // C3918
         E(i);
   }
};

El error C3918 también puede producirse por una suscripción incorrecta a un evento. El ejemplo siguiente genera el error C3918.

// C3918_3.cpp
// compile with: /clr /c
using namespace System;

public delegate void del();

public ref class A {
public:
   event del^ e {
      void add(del ^handler ) {
         d += handler;
      }

      void remove(del ^handler) {
         d -= handler;
      }

      void raise() {
         d();
      }
   }

   del^ d;
   void f() {}

   A() {
      e = gcnew del(this, &A::f);   // C3918
      // try the following line instead
      // e += gcnew del(this, &A::f);
      e();
   }
};

int main() {
   A a;
}