2013-05-21 53 views
3

我已經在C++/CLI如下界面:C++/CLI 「無法導入成員」 警告

public interface class ISharedPtrInterface 
{ 
    void PrintSharedPtr(std::shared_ptr<std::wstring> ptr); 
}; 

這是實現如下:

public ref class SharedPtrClass : public ISharedPtrInterface 
{ 
public: 
    virtual void PrintSharedPtr(std::shared_ptr<std::wstring> ptr) 
    { 
     System::Console::WriteLine(gcnew System::String(ptr->c_str())); 
    }; 
}; 

編譯在Visual Studio 2010,我得到以下警告:

1>TestSharedPtrInterface.cpp(8): warning C4679: 'ISharedPtrInterface::PrintSharedPtr' : could not import member 
1>   This diagnostic occurred while importing type 'ISharedPtrInterface ' from assembly 'AnotherCLRProject, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. 

如果我運行編譯的方法,我得到以下運行時e RROR:

Method 'PrintSharedPtr' in type 'SharedPtrClass' from assembly 'CLRProject, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation.

如果在接口/實現使用直的std :: wstring的,不會發生錯誤。誰能解釋爲什麼?

非常感謝!

+0

我不知道問題是什麼,但我知道你不需要的wstring中的unique_ptr – paulm

+0

這僅僅是一個簡單的例子,重現我在一個更大的項目中遇到的錯誤。我知道在這種情況下我不需要shared_ptr,但我想了解警告。 – mickeyt

回答

4

您正在公共接口級別混合原生類型和託管類型。也就是說,在這種情況下,您有一個公共託管接口方法,它將本機類型作爲參數。一般來說,這不是一個好主意,因爲你不能輕易地使用C#這樣的託管語言來使用這些方法,因爲你不能提供本地類型。

這裏的問題與本機類型的可見性有關:默認情況下,所有本機類型都是私有的。當它試圖導入ISharedPtrInterface::PrintSharedPtr時,它需要有訪問接口(它是公開的),並且可以訪問所有參數類型。

您可以使用make_public將本機類型標記爲公開,或直接將其標記爲公共(使用/ clr編譯時)。

問題是,有沒有辦法公開模板化的類型(make_public不起作用)。

參見:

+2

謝謝 - 我最終通過包裝本地類型和make_public附註組合了它,但您的解釋幫助我理解了爲什麼我需要這樣做! – mickeyt