Partilhar via


Compilador erro C3767

Mensagem de erro

funções de candidato 'função' não está acessíveis

Uma função de amigo definida em uma classe não deve ser tratado sistema autônomo se fosse definido e declarada no escopo de namespace global.Ele pode, entretanto, localizado pela pesquisa dependente do argumento.

C3767 também pode ser causado por uma alterar significativa: tipos nativo estão agora particular por padrão em um /clr compilação; consulte Visibility tipo Para obter mais informações.

O exemplo a seguir gera 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();
};

O exemplo a seguir gera 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();
};

O exemplo a seguir gera 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();
   }
};

O exemplo a seguir gera 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();
   }
};

No Visual C++ .NET 2002, o compilador mudou a forma que ele procurados símbolos.Em alguns casos, ele seria automaticamente procurou para símbolos em um especificado namespace.Agora, ele usará pesquisa dependente do argumento.Para obter mais informações, consulte Resumo das alterações de quebras de time de compilar.

O exemplo a seguir gera 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
}

Para obter um código que é válido no Visual C++ .NET 2003 e o Visual C++ .NET 2002, declare o amigo no escopo de classe e defini-lo no escopo do espaço para nome:

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

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

int main() {
   func();
}