0
error C2664: 'CCertStoreHelper::DeleteCtl' : cannot convert parameter 1 from 'const std::basic_string<_Elem,_Traits,_Ax>' to 'std::wstring &error C2664: 'CCertStoreHelper::DeleteCtl' : cannot convert parameter 1 from 'const std::basic_string<_Elem,_Traits,_Ax>' to 'std::wstring &
with
      [
              _Elem=wchar_t,
              _Traits=std::char_traits<wchar_t>,
              _Ax=std::allocator<wchar_t>
      ]
      Conversion loses qualifiers

我对此一无所知。所以请提供解决方案。

代码:

CCertStoreHelper certCaStore;
std::set<std::wstring> ctlIdentifiersToRemove; // It populates data which I m not mentioning


std::set<std::wstring>::iterator iter1;
std::set<std::wstring>::iterator iter2;

for(iter1 = ctlIdentifiersToRemove.begin(); iter1 != ctlIdentifiersToRemove.end(); iter1++)
{
    iter2 = ctlIdentifiersReferenced.find((*iter1));
    if(iter2 == ctlIdentifiersReferenced.end()) 
    {
        if(certCaStore.DeleteCtl((*iter1))) // error line
        {
            // ...
        }
    }
}
// prototype for DeleteCtl fun is
bool CCertStoreHelper::DeleteCtl(std::wstring &ctlIdentifier)

请纠正我做错了什么谢谢

4

1 回答 1

2

正如 twalberg 所指出的,编译器错误消息中最重要的部分是“丢失限定符”位。它还告诉您它不能从const std::wstringto转换std::wstring&,除了它将第一个扩展std::wstring为其完整的模板实例化形式。

问题是您DeleteCtl通过非常量引用获取参数,就好像它想修改那里的字符串(坏主意),但它不能这样做,因为您正在迭代一个集合,并且您无法更改一个集合的成员,一旦他们在那里(本质上,和std::set之间没有区别)。原因是它的内部结构基于其元素的值,如果您更改这些值,则内部结构将变得无效,并且会发生可怕的事情。const_iteratoriteratorstd::set

于 2013-09-12T14:39:54.070 回答