| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Работа с STL |
| Автор: Guest_Александр 14.2.2003, 21:08 |
| Хочется создать контейнер set из указателей на объекты класса A, упорядочивая указатели особым образом. Но вот эта штука в MS VC++ 6.0 почему-то не компилируется. #include <string> #include <set> #include <iostream> using namespace std; class A { string m_name; public: A(const string& name):m_name(name){}; const string& GetName(){ return m_name;}; }; bool operator<(const auto_ptr<A>& _L, const auto_ptr<A>& _R) {return (_L->GetName() < _R->GetName());} void main(void) { set<auto_ptr<A> > myset; auto_ptr<A> tmp(new A("aaa")); myset.insert(tmp); } Компилятор сыпет ерроры. В чем косяк c:\program files\microsoft visual studio\vc98\include\functional(86) : error C2784: 'bool __cdecl std::operator <(const class std::multiset<_K,_Pr,_A> &,const class std::multiset<_K,_Pr,_A> &)' : could not deduce template argument for 'const class s td::multiset<_K,_Pr,_A> &' from 'const class std::auto_ptr<class A>' c:\program files\microsoft visual studio\vc98\include\functional(86) : while compiling class-template member function 'bool __thiscall std::less<class std::auto_ptr<class A> >::operator ()(const class std::auto_ptr<class A> &,const class std ::auto_ptr<class A> &) const' c:\program files\microsoft visual studio\vc98\include\functional(86) : error C2784: 'bool __cdecl std::operator <(const class std::set<_K,_Pr,_A> &,const class std::set<_K,_Pr,_A> &)' : could not deduce template argument for 'const class std::set<_K ,_Pr,_A> &' from 'const class std::auto_ptr<class A>' c:\program files\microsoft visual studio\vc98\include\functional(86) : while compiling class-template member function 'bool __thiscall std::less<class std::auto_ptr<class A> >::operator ()(const class std::auto_ptr<class A> &,const class std ::auto_ptr<class A> &) const' c:\program files\microsoft visual studio\vc98\include\functional(86) : error C2784: 'bool __cdecl std::operator <(const class std::_Tree<_K,_Ty,_Kfn,_Pr,_A> &,const class std::_Tree<_K,_Ty,_Kfn,_Pr,_A> &)' : could not deduce template argument for 'c onst class std::_Tree<_K,_Ty,_Kfn,_Pr,_A> &' from 'const class std::auto_ptr<class A>' c:\program files\microsoft visual studio\vc98\include\functional(86) : while compiling class-template member function 'bool __thiscall std::less<class std::auto_ptr<class A> >::operator ()(const class std::auto_ptr<class A> &,const class std ::auto_ptr<class A> &) const' c:\program files\microsoft visual studio\vc98\include\functional(86) : error C2784: 'bool __cdecl std::operator <(const class std::basic_string<_E,_Tr,_A> &,const _E *)' : could not deduce template argument for 'const class std::basic_string<_E,_Tr, _A> &' from 'const class std::auto_ptr<class A>' c:\program files\microsoft visual studio\vc98\include\functional(86) : while compiling class-template member function 'bool __thiscall std::less<class std::auto_ptr<class A> >::operator ()(const class std::auto_ptr<class A> &,const class std ::auto_ptr<class A> &) const' c:\program files\microsoft visual studio\vc98\include\functional(86) : error C2784: 'bool __cdecl std::operator <(const _E *,const class std::basic_string<_E,_Tr,_A> &)' : could not deduce template argument for 'const *' from 'const class std::auto _ptr<class A>' c:\program files\microsoft visual studio\vc98\include\functional(86) : while compiling class-template member function 'bool __thiscall std::less<class std::auto_ptr<class A> >::operator ()(const class std::auto_ptr<class A> &,const class std ::auto_ptr<class A> &) const' c:\program files\microsoft visual studio\vc98\include\functional(86) : error C2784: 'bool __cdecl std::operator <(const class std::basic_string<_E,_Tr,_A> &,const class std::basic_string<_E,_Tr,_A> &)' : could not deduce template argument for 'const class std::basic_string<_E,_Tr,_A> &' from 'const class std::auto_ptr<class A>' c:\program files\microsoft visual studio\vc98\include\functional(86) : while compiling class-template member function 'bool __thiscall std::less<class std::auto_ptr<class A> >::operator ()(const class std::auto_ptr<class A> &,const class std ::auto_ptr<class A> &) const' c:\program files\microsoft visual studio\vc98\include\functional(86) : error C2784: 'bool __cdecl std::operator <(const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &,const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &)' : could not deduce te mplate argument for 'const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &' from 'const class std::auto_ptr<class A>' c:\program files\microsoft visual studio\vc98\include\functional(86) : while compiling class-template member function 'bool __thiscall std::less<class std::auto_ptr<class A> >::operator ()(const class std::auto_ptr<class A> &,const class std ::auto_ptr<class A> &) const' c:\program files\microsoft visual studio\vc98\include\functional(86) : error C2784: 'bool __cdecl std::operator <(const struct std::pair<_T1,_T2> &,const struct std::pair<_T1,_T2> &)' : could not deduce template argument for 'const struct std::pair< _T1,_T2> &' from 'const class std::auto_ptr<class A>' c:\program files\microsoft visual studio\vc98\include\functional(86) : while compiling class-template member function 'bool __thiscall std::less<class std::auto_ptr<class A> >::operator ()(const class std::auto_ptr<class A> &,const class std ::auto_ptr<class A> &) const' c:\program files\microsoft visual studio\vc98\include\functional(86) : error C2676: binary '<' : 'const class std::auto_ptr<class A>' does not define this operator or a conversion to a type acceptable to the predefined operator c:\program files\microsoft visual studio\vc98\include\functional(86) : while compiling class-template member function 'bool __thiscall std::less<class std::auto_ptr<class A> >::operator ()(const class std::auto_ptr<class A> &,const class std ::auto_ptr<class A> &) const' Error executing cl.exe. |
| Автор: Fantasist 15.2.2003, 01:36 | ||
| Надо поиграться с определениями. Попробуй, например, так:
|
| Автор: Vyacheslav 15.2.2003, 02:19 |
| Ты пытаешься претворить в жизнь то, что постарался запретить комитет по стандартизации С++, а именно контейнеры auto_ptr, иначе COAP(Containers Of Auto_Ptr) . Так что возможно библиотека STL, включенная в VC6 просто поддерживает это запрещение. Дело в том что работа таких контейнеров просто непредсказуема и связана она с тем, что при копировании auto_ptr право владения объектом, на которорый ссылается указатетель, переходит к копии, а исходному указателю присваивается NULL. За подорбностями отсылаю к "Эффективному использованию STL" Скотта Мейерса (Совет 8:Никогда не создавайте контейнеры, содержащие auto_ptr) |