SORU
20 NİSAN 2009, PAZARTESİ


Sınıflar std içeren ihraç:: dll nesneleri (vektör, harita, vb)

Std gibi nesneleri içeren bir DLL sınıflardan vermek için çalışıyorum::Vector ve std::yanıyor - tüm sınıfın dll ihracat yoluyla ilan edilmiştir:

    class DLL_EXPORT FontManager
{

Sorun karmaşık türleri üyeleri için bu bir uyarı olsun

uyarı C4251: 'FontManager::m__tipleri : class 'std::map<_Kty,_Ty>'ihtiyaçları var dll arayüzü tarafından kullanılmak üzere müşterilerine birinci sınıf FontManager' ile [ _Kty=:: std dize, _Ty=tFontİnfoRef ]

Üye değişkenleri kendi türü değiştirmiyorum bile onlardan önce aşağıdaki ileri sınıf bildirimi koyarak uyarıları kaldırmak için bir şansım var:

template class DLL_EXPORT std::allocator<tCharGlyphProviderRef>;
template class DLL_EXPORT std::vector<tCharGlyphProviderRef,std::allocator<tCharGlyphProviderRef> >;
std::vector<tCharGlyphProviderRef> m_glyphProviders;

Gibi ileri Bildirgesi"," üye derlenmiş ama güvenli mi? için DLL_EXPORT enjekte görünüyor İstemci bu başlığı derler ve onun tarafında std kap kullandığında gerçekten bir şeyleri değiştirir mi? Böyle kapsayıcı bir DLL_EXPORT gelecekteki tüm kullanır (ve muhtemelen içi değil mi?) edecek midir? Ve gerçekten uyarı hakkında uyarmaya çalışır bu sorunu çözüyor mu?

Bu uyarı endişelenmem gereken bir şey ya da en iyisi bu yapıları kapsamında devre dışı bırakmak için olabilir mi? Müşteriler ve dll her zaman kütüphaneler ve uygulamaları aynı seti kullanılarak inşa edilecek ve bu başlık yalnızca sınıfları

Standart STD kütüphanesi ile Visual Studio 2003 kullanıyorum.

---- Güncelleme ----

İsterim seni daha fazla olsa da hedef olarak görüyorum cevaplar genel ve burada bahsediyoruz std kaplar ve türleri (örneğin, std::string) - belki de asıl soru:

Biz devre dışı uyarı için standart kaplar ve çeşitlerine hem istemci hem de dll ile aynı kitaplığı üstbilgi ve onları tedavi gibi oluruz tedavisinde bir int veya diğer dahili tip? (Doğru yanımda işe yarıyor.) Yani bu yapabileceğimiz koşullar olmalıdır?

Ya da belki bu kaplar, kullanımı yasak ya da en azından bakımı atama operatörleri, kopya yapıcılar vb dll istemci içine inlined alacak emin olmak için alınan ultra olmalıdır?

Genel olarak, bilmek istiyorum eğer hissediyorum tasarımı bir dll arayüzü olan bu tür nesneler (örneğin kullanarak onları geri dönmek şeyleri, müşteri olarak geri dönüş değeri tipleri) iyi bir fikir ya da değil ve neden gerek var bir "yüksek düzeyde" arayüzü için bu işlevi... belki de en iyi çözüm nedir, Neil Butterworth önerdi - oluşturma statik bir kütüphane mi?

CEVAP
20 NİSAN 2009, PAZARTESİ


İstemciden sınıfınızın bir üyesi dokunduğunuzda, DLL-arabirim sağlamak gerekir. Derleyici DLL içinde işlev oluşturur ve onu alınabilir kılan DLL arabirimi anlamına gelir.

Derleyici DLL_EXPORTED bir sınıf müşteriler tarafından kullanılan bilmiyor çünkü tüm yöntemleri dll-ihraç zorlamak gerekir. İstemciler tarafından erişilebilir tüm üyeleri dll-ihracat işlevlerini de zorlamak gerekir. Bu derleyici yöntemleri verilmeyen ve müşteri linker uyarı hata gönderme olur.

Her üye, müşteriler tarafından dll-ihracat, örneğin özel dokunmatik üyeleri ile işaretlenmiş olmalıdır. Burada göz ardı uyarılar/(derleyici dikkat dtor/az üretilen) devre dışı bırakabilirsiniz.

Aksi takdirde üyeler kendi yöntemleri vermeniz gerekir. İleri DLL_EXPORT ile ilan eden bu sınıfların yöntemlerini vermez. Derleme birimi olarak DLL_EXPORT kendi göre sınıfları işareti var.

Aşağı ... dll ihracata üyeleri için değil () kaynar

  1. Eğer varsa bile/değil hangi üyeleri istemciler tarafından kullanılabilir mi var, uyarı kapatın.

  2. Eğer istemciler tarafından kullanılması gereken üyeleri varsa, dll-ihracat sarıcı oluşturmak veya yönlendirme yöntemleri oluşturmak.

  3. Dışarıdan görünen üye sayısını azaltmak için PİMPL gibi yöntemleri kullanın.


template class DLL_EXPORT std::allocator<tCharGlyphProviderRef>;

Bu geçerli bir derleme biriminde şablon uzmanlaşma bir örnekleme oluşturur. Bu std yöntemlerini oluşturur::dll ayırıcı ve ilgili yöntemleri verir. Bu sadece şablon sınıfları bir örnekleme olarak beton sınıfları için çalışmıyor.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Motor Trend Channel

    Motor Trend

    11 Mart 2006
  • superemposed

    superemposed

    25 Aralık 2007
  • Troy Hunt

    Troy Hunt

    29 EYLÜL 2011