2013-07-19 46 views
0

考慮導出類streamTest的dll。下面的代碼:當std :: map <int,std :: ofstream>成員時,類不會從dll導出

class streamTest 
{ 
public: 
    TEST_API streamTest(); 
    TEST_API ~streamTest(); 

private: 
    std::map<int,std::ofstream> streamMap; 
}; 

編譯沒有錯誤並運行從應用程序鏈接到DLL,精細不過下面的代碼:

class TEST_API streamTest 
{ 
public: 
    streamTest(); 
    streamTest(); 

private: 
    std::map<int,std::ofstream> streamMap; 
}; 

給出警告,然後錯誤:

1>warning C4251: 'streamTest::streamMap' : class 'std::map<_Kty,_Ty>' needs to have dll-interface to be used by clients of class 'streamTest' 
1>   with 
1>   [ 
1>    _Kty=int, 
1>    _Ty=std::ofstream 
1>   ] 
1>c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\fstream(1116): error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ios(176) : see declaration of 'std::basic_ios<_Elem,_Traits>::basic_ios' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   This diagnostic occurred in the compiler generated function 'std::basic_ofstream<_Elem,_Traits>::basic_ofstream(const std::basic_ofstream<_Elem,_Traits> &)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 

爲什麼它不會編譯,我如何提供std :: map的dll接口?我已經使用std :: map對象,然後在dll中沒有任何問題之前,std :: ofstream。請讓我知道我錯過了什麼...

P.S. TEST_API簡直是

#ifdef TEST_EXPORTS 
#define TEST_API __declspec(dllexport) 
#else 
#define TEST_API __declspec(dllimport) 
#endif 

回答

1

ofstream不可複製。導出該類會強制實例化map<int,std::ofstream>的所有方法 - 包括那些試圖複製該值的方法。

您正在使用VC10,它不支持C++ 11功能。我不相信你可以在map那裏存儲ofstream,導出或不導出。

+0

謝謝,這很有道理 - +1。那麼,沒有解決辦法?當我導出所有的方法,但不是類本身時,它可以正常工作... –

+0

你有沒有真正將'ofstream'實例放入'streamMap'中的代碼?如果編寫了這樣的代碼,我會感到驚訝。如果你不這樣做,那麼'streamMap'是什麼? –

+0

是的,這只是代表該程序的示例。我把例如streamMap.insert(key,std :: ofstream(fname.c_str(),std :: ios_base :: binary));,工作正常。 –

相關問題