2009-12-09 80 views
1

我有我的代碼的循環使用std::basic_string<HANDLE>,然後等待它是這樣的:我可以在std :: basic_string中使用非字符類型的東西嗎?

DWORD dwWaitResult = WaitForMultipleObjects((DWORD)handles.size(), 
              handles.data(), 
              FALSE, POLL_INTERVAL_MS); 

工作罰款,但是當我打開/ W4和/分析時,Visual C++ 2008具有以下(削減和包裹爲簡潔起見)警告說:

iosfwd(266) : warning C6001: Using uninitialized memory '*_First' 
iosfwd(262) : while compiling class template member function 
     'HANDLE *std::char_traits<_Elem>::assign(_Elem *,size_t,_Elem)' 
     with [ _Elem=HANDLE ] 
xstring(2155) : see reference to class template instantiation 
     'std::char_traits<_Elem>' being compiled 
     with [ _Elem=HANDLE ] 
xstring(2148) : while compiling class template member function 
     'void std::basic_string<_Elem>::_Tidy(bool,unsigned int)' 
     with [ _Elem=HANDLE ] 
.\MyCode.cpp(231) : see reference to class template instantiation 
     'std::basic_string<_Elem>' being compiled 
     with [ _Elem=HANDLE ] 

iosfwd(222) : warning C6001: Using uninitialized memory '*_First1' 
iosfwd(216) : while compiling class template member function 
     'HANDLE *std::char_traits<_Elem>::_Copy_s 
       (_Elem *,size_t,const _Elem *,size_t)' 
     with [ _Elem=HANDLE ] 

問題:

  1. 是合法的使用std :: basic_string的w^ith不是簡單的字符類型(即charwchar_t)?
  2. 如果是這樣,我該怎麼辦才能擺脫這些警告?回答#pragma warning(disable)需要證明。
  3. 如果不是,爲什麼不呢?我應該用什麼來代替?

爲了記住Boost已經出來,並且我們僅限於Visual C++ 2008中的STL實現, TR1的Visual C++位是允許的。

+0

只是爲了讓我知道,爲什麼你使用一串手柄,而不是一個向量? – catchmeifyoutry

+0

對WaitForMultipleObjects的調用要求句柄在內存中連續。當我寫這個代碼的時候(幾年前),我不知道載體是連續的。 –

回答

4
  1. 是的,如果您爲您的類型提供了class traits的模板專門化。

  2. 提供您的專業class traits。 (第二個模板參數class std::basic_string)。

  3. 它是。但你有沒有想過使用std::vector而不是std::basic_string? (它沒有提供比較等字符串幫助函數的這個特徵模板參數)

6

使用一個std :: vector而不是試圖堵塞那個方形釘到圓孔怎麼回事?

0

看起來您需要爲您的HANDLE類型提供專門的char_traits模板。

2

請注意,std::basic_string s絕對不能保證是連續的內存,而WaitForMultipleObjects永遠不會知道。我強烈建議使用矢量。

+2

但他使用'data()'而不是'&data [0]'來訪問句柄,所以他應該是安全的。 –

相關問題