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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вложенный класс + STD + оперратор == 
V
    Опции темы
SeregaLBN
Дата 24.7.2006, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Покажу на примере (пользуюсь VS6).

Есть простой код - класс 'Запись' и класс векторов этих записей:
Код

#include <windows.h>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

struct CRecord {
   string     m_strName;
   // ...
};

bool operator==(const CRecord& r1, const CRecord& r2) {
   return (r1.m_strName == r2.m_strName);
}

class CWrapper {
private:
   vector<CRecord> m_Records;

public:
   void Find(int index) const;
};

void CWrapper::Find(int index) const {
   //...
   std::find(m_Records.begin(), m_Records.end(), m_Records[index]);
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
   return 0;
}

Всё отлично компилируется.

А вот при попытке вложить класс CRecord внутрь CWrapper (т.к. у меня CRecord есть сущность только CWrapper'а) и происходят ошибки.
Подскажите что и как тут переделать... Насколько я понимаю, траблы в операторе ==, но вот как исправить...
Переделанный код:
Код

#include <windows.h>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

class CWrapper {
private:
   struct CRecord {
      string     m_strName;
      // ...
   };


   static bool operator==(const CWrapper::CRecord& r1, const CWrapper::CRecord& r2) {
      return (r1.m_strName == r2.m_strName);
   }

   vector<CRecord> m_Records;

public:
   void Find(int index) const;
};

void CWrapper::Find(int index) const {
   std::find(m_Records.begin(), m_Records.end(), m_Records[index]);
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
   return 0;
}


А ошибки следующие:
error C2784: 'bool __cdecl std::operator ==(const class std::istream_iterator<_U,_E,_Tr> &,const class std::istream_iterator<_U,_E,_Tr> &)' : could not deduce template argument for 'const class std::istream_iterator<_U,_E,_Tr> &' from 'const struct CWrapper::CRecord'
        see reference to function template instantiation 'const struct CWrapper::CRecord *__cdecl std::find(const struct CWrapper::CRecord *,const struct CWrapper::CRecord *,const struct CWrapper::CRecord &)' being compiled

error C2784: 'bool __cdecl std::operator ==(const class std::reverse_bidirectional_iterator<_BI,_Ty,_Rt,_Pt,_D> &,const class std::reverse_bidirectional_iterator<_BI,_Ty,_Rt,_Pt,_D> &)' : could not deduce template argument for 'const class std::reverse_bidirectional_iterator<_BI,_Ty,_Rt,_Pt,_D> &' from 'const struct CWrapper::CRecord'
        see reference to function template instantiation 'const struct CWrapper::CRecord *__cdecl std::find(const struct CWrapper::CRecord *,const struct CWrapper::CRecord *,const struct CWrapper::CRecord &)' being compiled

error C2784: 'bool __cdecl std::operator ==(const class std::vector<_Ty,_A> &,const class std::vector<_Ty,_A> &)' : could not deduce template argument for 'const class std::vector<_Ty,_A> &' from 'const struct CWrapper::CRecord'
        see reference to function template instantiation 'const struct CWrapper::CRecord *__cdecl std::find(const struct CWrapper::CRecord *,const struct CWrapper::CRecord *,const struct CWrapper::CRecord &)' being compiled
 
PM MAIL   Вверх
SeregaLBN
Дата 24.7.2006, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Разобрался. Тема закрыта
Код

#include <windows.h>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

class CWrapper {
private:
   struct CRecord {
      string     m_strName;
      // ...
      bool operator==(const CRecord& r2) const {
         return (m_strName == r2.m_strName);
      }
   };

   //friend bool operator==(const CWrapper::CRecord& r1, const CWrapper::CRecord& r2) {
   //   return (r1.m_strName == r2.m_strName);
   //}
   vector<CRecord> m_Records;

public:
   void Find(int index) const;
};

void CWrapper::Find(int index) const {
   find(m_Records.begin(), m_Records.end(), m_Records[index]);
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
   return 0;
}
 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0411 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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