Errore del compilatore C3767

Aggiornamento: novembre 2007

Messaggio di errore

'funzione': funzione o funzioni candidate non accessibili
'function' candidate function(s) not accessible

Non è previsto che una funzione di tipo friend definita in una classe venga trattata come se fosse definita e dichiarata nell'ambito dello spazio dei nomi globale; tuttavia, può essere trovata mediante la ricerca dipendente dall'argomento.

L'errore C3767 può anche essere provocato da una importante modifica: i tipi nativi sono ora privati per impostazione predefinita in una compilazione /clr; per ulteriori informazioni, vedere Type Visibility.

Nell'esempio seguente viene generato l'errore 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();
};

Nell'esempio seguente viene generato l'errore 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();
};

Nell'esempio seguente viene generato l'errore 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();
   }
};

Nell'esempio seguente viene generato l'errore 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();
   }
};

In Visual C++ .NET 2002 il compilatore modificava il modo di ricerca dei simboli; in alcuni casi avrebbe cercato automaticamente i simboli in uno spazio dei nomi specificato. Attualmente, si utilizza la ricerca dipendente dall'argomento. Per ulteriori informazioni, vedere Riepilogo delle ultime modifiche in fase di compilazione.

Nell'esempio seguente viene generato l'errore 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
}

Per codice valido in Visual C++ .NET 2003 e Visual C++ .NET 2002, dichiarare la funzione di tipo friend nell'ambito della classe e definirla nell'ambito dello spazio dei nomi:

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

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

int main() {
   func();
}