Perché "le funzioni candidate non sono accessibili" sebbene dichiarate pubbliche
-
28-10-2019 - |
Domanda
Sto ricevendo un errore di compilazione candidate function(s) not accessible
Quando chiamavo determinati membri, anche se li ho dichiarati come public
. Ricevo l'errore solo quando una classe da vtk è coinvolto (come tipo di ritorno o come argomento) e quando la classe da chiamare non è nello stesso VS-project del codice chiamante. Ho anche provato altri tipi VTK senza fortuna :(
Ecco un codice di prova:
// A.h, in a seperate class library
#include <vtkActor.h>
public ref class A
{
public:
A(void);
void test1(vtkActor* actor);
vtkActor* test2();
void test3(char* actor);
char* test4();
};
// B.h, Same as A but in the same project as the calling code
#include <vtkActor.h>
ref class B
{
public:
B(void);
void test1(vtkActor* actor);
vtkActor* test2();
void test3(char* actor);
char* test4();
};
Ho provato a chiamare le funzioni dallo stesso progetto B
è in questo modo:
// calls to class library
A^ testA = gcnew A();
testA ->test1(vtkActor::New()); // error
testA ->test2(); // error
testA ->test3(""); // ok
testA ->test4(); // ok
// calls to this project
B^ testB = gcnew B();
testB ->test1(vtkActor::New()); // ok
testB ->test2(); // ok
testB ->test3(""); // ok
testB ->test4(); // ok
Nelle due righe con // errore questo è il messaggio esatto:
error C3767: 'A::test1': candidate function(s) not accessible
Come posso risolvere questo errore? Perché si verifica solo sui tipi VTK?
Cordiali saluti, Richn
Soluzione
Un breve sguardo Documentazione C3767 E i commenti della comunità mostrano:
Un altro scenario di generazione di errori
Un'altra cosa che sembra generare questo errore è l'utilizzo di un tipo nativo nella firma di un metodo pubblico e quindi provare a chiamare quel metodo da un altro assembly.
La soluzione qui è quella di aggiungere un #pragma make_public sul tipo nativo, dopo aver definito il tipo nativo ma prima di definire il metodo gestito che lo utilizza. I documenti per #pragma make_public implicano che si suppone che si prenda un avvertimento del compilatore quando un tipo nativo non pubblico è esposto da un tipo gestito pubblico, ma (almeno con i livelli di avvertimento predefiniti) che non sembra essere il caso.
Hai controllato quel suggerimento?