Freigeben über


Compilerfehler C3767

Aktualisiert: November 2007

Fehlermeldung

'Funktion': Auf mögliche Funktion(en) kann nicht zugegriffen werden
'function' candidate function(s) not accessible

Bei einer in einer Klasse definierten Friend-Funktion wird nicht davon ausgegangen, dass sie so behandelt wird, als wäre sie im globalen Gültigkeitsbereich des Namespaces definiert und deklariert worden. Sie kann jedoch mittels einer argumentbezogenen Suche gefunden werden.

C3767 kann auch von einer wichtigen Änderung verursacht worden sein: Systemeigene Typen sind nun in einer /clr-Kompilierung standardmäßig privat. Weitere Informationen finden Sie unter Type Visibility.

Im folgenden Beispiel wird C3767 generiert:

// 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();
};

Im folgenden Beispiel wird C3767 generiert:

// 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();
};

Im folgenden Beispiel wird C3767 generiert:

// 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();
   }
};

Im folgenden Beispiel wird C3767 generiert:

// 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 wurde die Compilersuche nach Symbolen geändert. In einigen Fällen suchte der Compiler automatisch nach Symbolen in einem bestimmten Namespace. Mittlerweile wird die argumentbezogene Suche verwendet. Weitere Informationen finden Sie unter Übersicht über die wichtigsten Änderungen bei der Kompilierzeit.

Im folgenden Beispiel wird C3767 generiert:

// 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
}

Wenn Code sowohl in Visual C++ .NET 2003 als auch in Visual C++ .NET 2002 gültig sein soll, sollten Sie die Friend-Funktion im Klassenbereich deklarieren und im Namespacebereich definieren:

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

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

int main() {
   func();
}