我可以将std :: basic_string用于非字符类型的东西吗?

时间:2009-12-09 09:42:57

标签: c++ visual-c++

我的代码中有一个使用std::basic_string<HANDLE>的循环,然后像这样等待:

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

正常工作但是当我打开/ W4和/ analyze时,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用于非简单字符类型(即charwchar_t)是否合法?
  2. 如果是,我该怎么办才能摆脱这些警告?回答#pragma warning(disable)需要证明理由。
  3. 如果不是,为什么不呢?我该怎么用呢?
  4. 考虑到Boost已经出局,我们将获得额外的荣誉,并且我们仅限于Visual C ++ 2008中的STL实现;允许TR1的Visual C ++位。

4 个答案:

答案 0 :(得分:6)

使用std :: vector而不是试图将那个方形塞子塞进圆孔中有什么不对?

答案 1 :(得分:4)

  1. 是的,如果您为类型提供class traits的模板专精。

  2. 提供您的专业class traits。 (class std::basic_string)的第二个模板参数。

  3. 是的。但您是否考虑过使用std::vector代替std::basic_string? (它没有提供字符串辅助函数的特征模板参数,例如比较)

答案 2 :(得分:2)

请注意,std::basic_string永远不能保证是连续的记忆,WaitForMultipleObjects永远不会知道。我强烈建议使用矢量。

答案 3 :(得分:0)

您似乎需要为HANDLE类型提供char_traits模板的专业化。