2011-05-26 44 views
1

任何人都可以解释为什么我编译如下所示(以及如何解决它)奇怪C3767候选人功能(S)不能访问错误消息

错误C3767代码时,遇到下列错误:'ManagedClass::SetString':候选函数(多个)不可访问E:\ TEMP \ ManagedCpp \ ManagedCpp \ ManagedCpp.cpp 24 ManagedCpp

错误C3767:'ManagedClass::GetString':候选(多个)功能不可访问E:\ TEMP \ ManagedCpp \ ManagedCpp \ ManagedCpp.cpp 26 ManagedCpp

我阅读下列类似的问题, C++ CLI error C3767: candidate function(s) not accessible 其中规定

我建议使用托管型System::String^而不是所有的公共API。这也保证了你的图书馆从其他CLR语言轻松调用,如C#

这正是我所做的(顺便说一句这是用来提取相同的编译错误在一个更大的混合模式DLL中的测试代码) 。

(该项目为VS2008 C++/CLI项目从菜单中即选择文件 - >新建项目 - > VISUAL C++ - > CLR控制台应用程序。)

感谢所有您的帮助。

using namespace System; 

static public ref class ManagedClass 
{ 
    static public int SetString(String^ s) 
    { 
     str = s; 
    } 

    static public String^ GetString() 
    { 
     return str; 
    } 

    static String^ str ; 
}; 

int main(array<System::String ^> ^args) 
{ 
    String^ test ="Here"; 
    ManagedClass::SetString(test); 
    String^ j= ManagedClass::GetString(); 
    return 0; 
} 
+0

它有助于解决自上而下的错误消息。早期的消息(“静态”后面的'public',它不能去那里)通常会导致后面的消息(“我试图调用的函数是私有的”)。 – 2011-05-26 20:24:29

回答

3

您正在使用C#语法-ish;正确的C++/CLI语法如下:

public ref class ManagedClass abstract sealed 
{ 
public: 
    static void SetString(String^ s) { str = s; } 
    static String^ GetString() { return str; } 

private: // I assume you want this even though your code omitted it 
    static String^ str; 
}; 

请注意,.NET代码使用属性而不是get/set成员函数对会更习惯。

+0

谢谢...... !!!!! – Ted 2011-05-27 13:22:01