Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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);
}


Компилятор сыпет ерроры. В чем косякconfused.gif

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
Надо поиграться с определениями.
Попробуй, например, так:

Код


namespace std
{
 
  bool operator<(const auto_ptr<A>& _L, const auto_ptr<A>& _R)
  { return (_L->GetName() < _R->GetName());}

}







Автор: Vyacheslav 15.2.2003, 02:19
Ты пытаешься претворить в жизнь то, что постарался запретить комитет по стандартизации С++, а именно контейнеры auto_ptr, иначе COAP(Containers Of Auto_Ptr) . Так что возможно библиотека STL, включенная в VC6 просто поддерживает это запрещение. Дело в том что работа таких контейнеров просто непредсказуема и связана она с тем, что при копировании auto_ptr право владения объектом, на которорый ссылается указатетель, переходит к копии, а исходному указателю присваивается NULL. За подорбностями отсылаю к "Эффективному использованию STL" Скотта Мейерса (Совет 8:Никогда не создавайте контейнеры, содержащие auto_ptr)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)