почему «функции-кандидаты недоступны», хотя объявлены публичными - PullRequest
0 голосов
/ 06 декабря 2011

Я получаю ошибку компиляции candidate function(s) not accessible при вызове некоторых участников, хотя я объявил их как public.Я получаю сообщение об ошибке только тогда, когда задействован некоторый класс из vtk (в качестве возвращаемого типа или в качестве аргумента) и когда вызываемый класс находится не в том же VS-проекте, что и вызывающий код.Я также безуспешно пробовал другие типы vtk: (

Вот некоторый тестовый код:

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

Я пытался вызвать функции из того же проекта B выглядит так:

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

В двух строках с ошибкой // это точное сообщение:

error C3767: 'A::test1': candidate function(s) not accessible

Как я могу устранить эту ошибку? Почему она возникает только на vtk-типах?

С уважением, Ричн

1 Ответ

5 голосов
/ 06 декабря 2011

Краткий взгляд на документацию C3767 и комментарии сообщества показывают:

Еще один сценарий возникновения ошибок

Еще одна вещь, которая, похоже, вызывает эту ошибку,использование собственного типа в сигнатуре открытого метода, а затем попытка вызова этого метода из другой сборки.

Решение здесь заключается в добавлении #pragma make_public к собственному типу после определения собственного типано до определения управляемого метода, который его использует.Документы для #pragma make_public подразумевают, что вы должны получать предупреждение компилятора, когда непубличный собственный тип предоставляется открытым управляемым типом, но (по крайней мере, с уровнями предупреждений по умолчанию), что, похоже, не так.

Вы проверяли это предложение?

...