2009-12-09 3 views
1

나는 std::basic_string<HANDLE>를 사용하여 내 코드에서 루프를 가지고, 다음이처럼 기다립니다했습니다문자 유형이 아닌 것들과 함께 std :: basic_string을 사용할 수 있습니까?

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

벌금을 작동하지만이 켜지지/W4 및/분석 그것은, 비주얼 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. 가 법적 표준을 사용하는 :: 승 basic_string인가 단순한 문자 유형이 아닌 (즉, char 또는 wchar_t)?
  2. 그렇다면이 경고를 없애기 위해 무엇을해야합니까? 응답 #pragma warning(disable)은 칭의가 필요합니다.
  3. 그렇지 않다면 왜 안됩니까? 그리고 대신 무엇을 사용해야합니까?

부스트가 끝났음을 명심하기 위해 추가 크레딧이 주어질 것이며, 우리는 Visual C++ 2008의 STL 구현으로 제한됩니다. TR1의 Visual C++ 비트는 허용됩니다.

+0

왜 내가 알고 있는지, 왜 벡터가 아닌 일련의 핸들을 사용합니까? – catchmeifyoutry

+0

WaitForMultipleObjects를 호출하려면 핸들이 메모리에서 연속적이어야합니다. 이 코드를 작성한 시점 (몇 년 전)에 나는 벡터가 연속적이라는 것을 알지 못했습니다. –

답변

4
  1. 예, 해당 유형에 class traits의 템플릿 전문화를 제공하면 가능합니다.

  2. class traits을 제공하십시오. (class std::basic_string의 두 번째 템플리트 매개 변수).

  3. 입니다. 하지만 std::basic_string 대신 std::vector을 사용하는 것에 대해 생각해 보셨나요? (비교와 같은 문자열 도우미 함수를 제공하는이 특성 템플릿 인수가 없습니다.)

6

둥근 구멍에 정사각형 페그를 끼워 넣는 대신 std :: vector를 사용하면 무슨 문제가 있습니까?

0

핸드 유형에 char_traits 템플릿의 특수화를 제공해야하는 것처럼 보입니다.

2

std::basic_string은 연속적인 메모리가 보장되지 않습니다. WaitForMultipleObjects은 결코 알 수 없습니다. 대신 벡터를 사용하는 것이 좋습니다.

+2

하지만 그는 안전해야하므로 핸들에 액세스하기 위해'data()'가 아니라'& data [0]'을 사용하고 있습니다. –

관련 문제