3

我在 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'.

如果我运行编译的方法,我会收到以下运行时错误:

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

如果在接口/实现中使用直接的 std::wstring,则不会发生错误。谁能解释为什么?

非常感谢!

4

1 回答 1

4

您在公共接口级别混合了本机类型和托管类型。也就是说,在这种情况下,您有一个将本机类型作为参数的公共托管接口方法。一般来说,这不是一个好主意,因为您无法从 C# 等托管语言轻松使用这些方法,因为您无法提供本机类型。

这里的问题与原生类型的可见性有关:默认情况下,所有原生类型都是私有的。当它尝试导入ISharedPtrInterface::PrintSharedPtr时,它需要有权访问接口(因为它是公共的,所以它会这样做)并访问所有参数类型。

您可以使用或直接将本机类型make_public标记为公共(使用 /clr 编译时)将它们标记为公共。

问题是没有办法公开模板类型(make_public 对它们不起作用)。

看:

于 2013-05-21T15:30:23.917 回答