Compartir a través de


Error del compilador C3767

Actualización: noviembre 2007

Mensaje de error

'función': no se puede obtener acceso a las funciones candidato
'function' candidate function(s) not accessible

Se supone que una función friend definida en una clase no se va a tratar como si estuviera definida y declarada en el ámbito del espacio de nombres global. Sin embargo, se puede encontrar en una búsqueda dependiente de argumentos.

El error C3767 también lo puede causar un cambio importante: ahora los tipos nativos son privados de manera predeterminada en una compilación /clr; vea Type Visibility para obtener más información.

El ejemplo siguiente genera el error C3767:

// C3767a.cpp
// compile with: /clr
using namespace System;
public delegate void TestDel();

public ref class MyClass {
public:
   static event TestDel^ MyClass_Event;
};

public ref class MyClass2 : public MyClass {
public:
   void Test() {
      MyClass^ patient = gcnew MyClass;
      patient->MyClass_Event();
    }
};

int main() {
   MyClass^ x = gcnew MyClass;
   x->MyClass_Event();   // C3767

   // OK
   MyClass2^ y = gcnew MyClass2();
   y->Test();
};

El ejemplo siguiente genera el error C3767:

// C3767b.cpp
// compile with: /clr:oldSyntax
using namespace System;
__delegate void TestDel();

public __gc class MyClass {
public:
   static __event TestDel * MyClass_Event;
};

public __gc class MyClass2 : public MyClass {
public:
   void Test() {
      MyClass* patient = new MyClass;
      patient->MyClass_Event();
    }
};

int main() {
   MyClass* x = new MyClass;
   x->MyClass_Event();   // C3767

   // OK
   MyClass2 * y = new MyClass2();
   y->Test();
};

El ejemplo siguiente genera el error C3767:

// C3767c.cpp
// compile with: /clr /c

ref class Base  {
protected:
   void Method() {
      System::Console::WriteLine("protected");
   }
};

ref class Der : public Base {
   void Method() {
      ((Base^)this)->Method();   // C3767
      // try the following line instead
      // Base::Method();
   }
};

El ejemplo siguiente genera el error C3767:

// C3767d.cpp
// compile with: /clr:oldSyntax /c

__gc class Base {
protected:
   void Method() {
      System::Console::WriteLine("protected");
   }
};

__gc class Der : public Base {
   void Method() {
      ((Base*)this)->Method();   // C3767
      // try the following line instead
      // Base::Method();
   }
};

En Visual C++ .NET 2002, el compilador realiza la búsqueda de símbolos de otra forma. En algunos casos, habría buscado símbolos automáticamente en un espacio de nombres especificado. Ahora utilizará una búsqueda dependiente de argumentos. Para obtener más información, vea Resumen de cambios importantes en tiempo de compilación.

El ejemplo siguiente genera el error C3767:

// C3767e.cpp
namespace N {
   class C {
      friend void FriendFunc() {}
      friend void AnotherFriendFunc(C* c) {}
   };
}

int main() {
   using namespace N;
   FriendFunc();   // C3767 error
   C* pC = new C();
   AnotherFriendFunc(pC);   // found via argument-dependent lookup
}

En caso de que el código sea válido tanto para Visual C++ .NET 2003 como para Visual C++ .NET 2002, incluya la declaración de la función friend en el ámbito de la clase y la definición en el ámbito del espacio de nombres:

// C3767f.cpp
class MyClass {
   int m_private;
   friend void func();
};

void func() {
   MyClass s;
   s.m_private = 0;
}

int main() {
   func();
}