2011-05-26 68 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