Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с STL 
:(
    Опции темы
Guest_Александр
Дата 14.2.2003, 21:08 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Хочется создать контейнер 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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Надо поиграться с определениями.
Попробуй, например, так:

Код


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

}









--------------------
Волны гасят ветер...
PM MAIL   Вверх
Vyacheslav
Дата 15.2.2003, 02:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



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


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2150 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.