2009-11-19 128 views
2

我有一個non-.NET C++類,如下所示:揭露非託管量靜態的std :: string在託管C++類

了foo.h:

namespace foo { 
    const static std::string FOO; 
    ... 
} 

Foo.cc:

using namespace foo; 

const std::string FOO = "foo"; 

我要揭露這在C#應用程序使用,但我一直對混合類型入門錯誤,當我嘗試以下方法:

FooManaged.h:

namespace foo { 
    namespace NET { 
    public ref class Foo { 
     public: 
     const static std::string FOO; 
    } 
    } 
} 

FooManaged.cc:

using namespace foo::NET; 

const std::string Foo::FOO = foo::FOO; 

什麼是翻譯的非託管字符串常量到託管字符串常量的正確方法?

+1

你在Foo.h中聲明瞭錯誤的變量。它需要是非'靜態'並且用'extern'聲明。 – 2009-11-19 03:18:51

回答

3

在C++/CLI中,使用literal關鍵字代替static const,您希望常量定義包含在暴露給完全託管應用程序的接口中。

public: 
    literal String^ Foo = "foo"; 

不幸的是,literal需要立即值,所以使用std::string值是不可能的。或者,您可以創建一個返回字符串的靜態只讀屬性。

public: 
    static property String^ Foo 
    { 
     String^ get() 
     { 
      return gcnew String(Foo::FOO.c_str()); 
     } 
    } 

就個人而言,我相信再改寫字符串,並使用literal是更好的選擇。但是,如果您非常關心持續更改(例如,在較新的版本中),則該屬性將在本地庫中使用FOO版本。