2012-01-18 7 views
3
>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, так что я на самом деле не в состоянии выяснить, проблема!!! любая помощь или предложение будут глубоко оценены !!! Заранее спасибо.ошибка: 2678, Ошибка компиляции в VS 2010,

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

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]); 
+0

Можете ли вы включить определения для SET_STR, setType, setCategory, setFilter? –

+0

Спасибо pragnar, пожалуйста, дайте мне знать, если я что-то пропущу !! – user1107855

ответ

3

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

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

Используйте станд :: 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().

Скотт Мейерс говорит о такого рода вещи в «Эффективное СТЛ», «Пункт 22: Избегайте в месте ключа модификации в set и multiset», в том числе, как некоторые компиляторы будут использовать const_iterator -Style итераторы для std::set.

+0

спасибо micheal, но я не могу следовать вашему полезному предложению. Я новичок в vC++, поэтому, пожалуйста, помогите мне с возможным синтаксисом. – user1107855

+1

Какая ошибка вы получаете, когда пытаетесь? Используйте std :: inserter (...) и добавьте строку #include

+0

Что сказал pragnar, плюс вам нужно удалить назначение в 'SET_STR :: iterator itOut' и, следовательно, вызов' erase() ' , –

Смежные вопросы