ошибка: 2678, ошибка компиляции в версии 2010, - PullRequest
3 голосов
/ 18 января 2012
>c:\program files\microsoft visual studio 10.0\vc\include\algorithm(4494): error C2678:    
binary '=' : no operator found which takes a left-hand operand of type 'const 
std::basic_string<_Elem,_Traits,_Ax>' (or there is no acceptable conversion)
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>,
           _Ax=std::allocator<char>
          ]
        c:\program files\microsoft visual studio 10.0\vc\include\xstring(707): could be  
'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator = 
(std::basic_string<_Elem,_Traits,_Ax> &&)'
    with
      [
          _Elem=char,
          _Traits=std::char_traits<char>,
          _Ax=std::allocator<char>
      ]
      c:\program files\microsoft visual studio 10.0\vc\include\xstring(762): or       'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(const std::basic_string<_Elem,_Traits,_Ax> &)'
      with
      [
          _Elem=char,
          _Traits=std::char_traits<char>,
          _Ax=std::allocator<char>
      ]
      c:\program files\microsoft visual studio 10.0\vc\include\xstring(767): or       
'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =  
(const _Elem *)'
    with
      [
          _Elem=char,
          _Traits=std::char_traits<char>,
          _Ax=std::allocator<char>
      ]
      c:\program files\microsoft visual studio 10.0\vc\include\xstring(772): or         
'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =  
(_Elem)'
    with
   [
          _Elem=char,
          _Traits=std::char_traits<char>,
          _Ax=std::allocator<char>
       ]
      while trying to match the argument list '(const  
std::basic_string<_Elem,_Traits,_Ax>, const std::basic_string<_Elem,_Traits,_Ax>)'
      with
      [
          _Elem=char,
          _Traits=std::char_traits<char>,
          _Ax=std::allocator<char>
      ]
      c:\program files\microsoft visual studio 10.0\vc\include\algorithm(4522) : see   
reference to function template instantiation '_OutIt  
std::_Set_intersection<_InIt1,_InIt2,_OutIt>(_InIt1,_InIt1,_InIt2,_InIt2,_OutIt)' being  
compiled
      with
      [


_OutIt=std::_Tree_const_iterator<std::_Tree_val<std::_Tset_traits<std::string,std::less<std    ::string>,std::allocator<std::string>,false>>>,


_InIt1=std::_Tree_unchecked_const_iterator<std::_Tree_val<std::_Tset_traits<std::string,std::less<std::string>,std::allocator<std::string>,false>>>,


_InIt2=std::_Tree_unchecked_const_iterator<std::_Tree_val<std::_Tset_traits<std::string,std ::less<std::string>,std::allocator<std::string>,false>>>
      ]
      c:\program files\microsoft visual studio 10.0\vc\include\algorithm(4549) : see  
reference to function template instantiation '_OutIt  
std::_Set_intersection1<std::_Tree_unchecked_const_iterator<_Mytree>,std::_Tree_unchecked_
const_iterator<_Mytree>,_OutIt> 
(_InIt1,_InIt1,_InIt2,_InIt2,_OutIt,std::tr1::true_type)' being compiled
      with
      [



_OutIt=std::_Tree_const_iterator<std::_Tree_val<std::_Tset_traits<std::string,std::less<std      ::string>,std::allocator<std::string>,false>>>,


_Mytree=std::_Tree_val<std::_Tset_traits<std::string,std::less<std::string>,std::allocator< 
std::string>,false>>,


_InIt1=std::_Tree_unchecked_const_iterator<std::_Tree_val<std::_Tset_traits<std::string,std
::less<std::string>,std::allocator<std::string>,false>>>,

_InIt2=std::_Tree_unchecked_const_iterator<std::_Tree_val<std::_Tset_traits<std::string,std     ::less<std::string>,std::allocator<std::string>,false>>>
         ]
     c:\qc\qc_daq_development\qc\qc_daq\src\hfgui3\expscan.cpp(458) : see reference to  
function template instantiation '_OutIt 

std::set_intersection<std::_Tree_const_iterator<_Mytree>,std::_Tree_const_iterator<_Mytree>     ,std::_Tree_const_iterator<_Mytree>>(_InIt1,_InIt1,_InIt2,_InIt2,_OutIt)' being   
compiled
      with
      [


_OutIt=std::_Tree_const_iterator<std::_Tree_val<std::_Tset_traits<std::string,std::less<std 
::string>,std::allocator<std::string>,false>>>,


_Mytree=std::_Tree_val<std::_Tset_traits<std::string,std::less<std::string>,std::allocator<
std::string>,false>>,


_InIt1=std::_Tree_const_iterator<std::_Tree_val<std::_Tset_traits<std::string,std::less<std
::string>,std::allocator<std::string>,false>>>,


_InIt2=std::_Tree_const_iterator<std::_Tree_val<std::_Tset_traits<std::string,std::less<std
::string>,std::allocator<std::string>,false>>>

Выше упомянуто сообщение об ошибке, сгенерированное при компиляции программы с Visual Studio 2010, поскольку оно хорошо работает в Visual Studio 2003, поэтому я действительно не могу выяснить проблему !!! любая помощь или предложение будут высоко оценены !!! Заранее спасибо.

Я вставляю строку, которая выдает сообщение об ошибке выше. В случае, если кто-то больше информации, пожалуйста, дайте мне знать, я буду благодарен вам, если вы потратите свое драгоценное время, помогая мне исправить это. Большое спасибо заранее

SET_STR::iterator itOut =  
std::set_intersection(setType.begin(),setType.end(),setCategory.begin(),setCategory.end(),s
etFilter.begin());
setFilter.erase(itOut,setFilter.end()); //erase the rest of the set

Definations:

 typedef std::set<string>                   SET_STR;
 typedef std::map<string, SET_STR >         MAP_STR_SETSTR;
 typedef std::map<char, SET_STR >           MAP_CHAR_SETSTR;
 typedef std::map<string,SfvarInfo>         MAP_STR_FVARINFO;


CritSec                 m_csVarAccess;                  
MAP_STR_VAL             m_mapVar;
MAP_STR_VAL             m_mapFvarOverrides;
MAP_STR_VAL             m_mapFvarOrig;
MAP_STR_FVARINFO        m_mapFvarInfo;
MAP_STR_SETSTR          m_mapCategoryFvar;              
MAP_CHAR_SETSTR         m_mapTypeFvar;                  
MAP_STR_VAL             m_mapLoadedFvar;

UserParam<string>       m_sScanFvar;
UserParam<string>       m_sFvarFilterType;
UserParam<string>       m_sFvarFilterCategory;

SET_STR setType(m_mapTypeFvar[m_sFvarFilterType.c_str()[0]]);
SET_STR setCategory(m_mapCategoryFvar[m_sFvarFilterCategory]);

1 Ответ

3 голосов
/ 18 января 2012

Нельзя присвоить элементу, на который указывает итератор, значение std::set, потому что это изменит «размещение» этого элемента в наборе (в общем случае). Поэтому вы не можете использовать setFilter.begin() в качестве выходного итератора для вызова set_intersection(), поскольку set_intersection() назначает через итератор.

По сути, set::iterator - это всегда const_iterator в VS 2010. У меня больше нет установленного VS2003, поэтому я не могу проверить, но я думаю, что тогда это было не так, поэтому он скомпилирован .

Вместо этого используйте std :: insert_iterator <>:

std::set_intersection( setType.begin(), setType.end(),
                       setCategory.begin(), setCategory.end(), 
                       inserter( setFilter, setFilter.begin()));

Это усложнит erase(), который вы выполняете после вызова set_intersection(), поскольку set_intersection() теперь будет возвращать insert_iterator<> вместо set<>::iterator. Из кода, который вы разместили, похоже, что вы хотите конечное содержимое setFilter содержит только элементы на пересечении, поэтому просто убедитесь, что setFilter пусто при вызове set_intersection(), и нет необходимости в операции erase().

Скотт Мейерс (Scott Meyers) говорит об этом в «Эффективном STL», «Пункт 22: Избегайте модификации ключей на месте в set и multiset», включая то, как некоторые компиляторы будут использовать итераторы в стиле const_iterator для std::set.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...