Çok sayıda paylaşılan kütüphaneyi kapsayan oldukça büyük boyutlu bir proje üzerinde çalışıyorum. Ayrıca STL, Boost ve kendi şablon sınıflarımız ve işlevlerimiz üzerinde de büyük güven duyuyoruz. Dışa aktarılan sınıfların çoğu, şablon üyeleri içerir ve dışa aktarılan işlevler şablon parametreleri içerir. Ben Visual Studio (2008 ve 2010 ikisi) derleme yaparkenPaylaşılan Nesne/DLL'deki Templated Sınıflarını ve İşlevlerini Kullanma
#if defined(_MSC_VER) && defined(_DLL)
// Microsoft
#define EXPORT __declspec(dllexport)
#define IMPORT __declspec(dllimport)
#elif defined(_GCC)
// GCC
#define EXPORT __attribute__((visibility("default")))
#define IMPORT
#else
// do nothing and hope for the best at link time
#define EXPORT
#define IMPORT
#endif
#ifdef _CORE_COMPILATION
#define PUBLIC_CORE EXPORT
#define EXTERNAL_CORE
#else
#define PUBLIC_CORE IMPORT
#define EXTERNAL_CORE extern
#endif
#include <deque>
// force exporting of templates
EXTERNAL_CORE template class PUBLIC_CORE std::allocator<int>;
EXTERNAL_CORE template class PUBLIC_CORE std::deque<int, std::allocator<int> >;
class PUBLIC_CORE MyObject
{
private:
std::deque<int> m_deque;
};
SO, benim sorun şu ki, şu olsun bu: İşte
ben kütüphane olarak kaydedebilme yapmak nasıl sadeleştirilmiş örnektir uyarı:uyarı C4251: 'std :: _ Deque_val < _Ty, _Alloc> :: _ Almap' : sınıf 'std :: ayırıcısı < _Ty>' için dll-inter sahip ihtiyacı Yüz sınıfı ait müşterileri 'std :: _ Deque_val < _Ty, _Alloc>' ı var
std::allocator<int>
, ihraç değil ima etmektedir
tarafından kullanılmak üzere. sınıf 'std :: deque < _Ty>':
uyarı C4251: 'MyObject :: m_deque' Ve bu benim ihracat
EXTERNAL_CORE template class PUBLIC_CORE std::allocator<int>; EXTERNAL_CORE template class PUBLIC_CORE std::deque<int, std::allocator<int> >;
dahil değil, çünkü yanlış gibi değil uyarı verir sınıfın müşterileri tarafından kullanılmak üzere dll-arayüze sahip olması gerekir 'MyObject'
Aklıma gelen tek şey _Ty
th hakkında uyarı olduğunu e std::allocator
bir şekilde bahsediyor int
, ancak bir std::deque<int>
mantıksal olarak bir std::allocator<int>
tahsis olurdu, aksi takdirde olacağını herhangi bir belirti bulamıyorum.
Tüketici bir uygulama sınıfı iyi kullanabilir, ancak bu uyarının göz ardı edilmemesi gerektiğine dair bir his var. Linux'ta g ++ ile derlerken, herhangi bir hata yayılmaz (bu doğru çalışmadığı anlamına gelmez). G ++ otomatik olarak MSVC'nin yapamadığı bir şey yapıyor mu? Linux'ta GCC'yi, OSX'te LLVM'yi ve Windows'ta MSVC'yi hedefledim, ancak Windows geliştirme için potansiyel olarak MinGW'ye geçebilirim, bu yüzden MSVC'yi terk etmek tam olarak bu sorunun dışında değildir (eğer bu bir rahatsızlıktan dolayı çok büyükse) .
_very_ bu uyarıları yorumlamayı denemeniz iyi! – xtofl
Bu, http://stackoverflow.com/q/5661738/417197 bir kopyası mı (ya da benzer)? –