为什么“候选功能无法访问”虽然公开宣布

时间:2011-12-06 12:51:48

标签: .net visual-c++ c++-cli vtk

我在调用某些成员时遇到编译错误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-types上?

亲切的问候, richn

1 个答案:

答案 0 :(得分:5)

简要介绍C3767 documentation,社区评论显示:

  

另一个产生错误的方案

     

似乎产生此错误的另一件事是使用本机类型   在公共方法的签名中,然后尝试调用它   来自不同集会的方法。

     

这里的解决方案是在本机类型上添加#pragma make_public,   在定义本机类型之后但在定义托管方法之前   使用它。 #pragma make_public的文档暗示你应该这么做   在公开非公共本机类型时获取编译器警告   公共托管类型,但(至少具有默认警告级别)   似乎并非如此。

你检查过那个建议吗?