Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите разобраться с operator overloading... / 5 сообщений из 5, страница 1 из 1
15.02.2007, 20:13
    #34334950
Полночный
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с operator overloading...
Привет,

Только начал заниматься C++ и наткнулся на непонятку. Понадобился двуассоциативный массив :) Т.е. такой, в котором можно индексироваться и по ключу (часто, быстро и RW) и по значению (редко, на производительность плевать и RO). Сделал примерно такой класс (работающий вариант, среда VC++ 2005):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
#include <map>
#include <string>

using std::map;
using std::string;

typedef map<int, string> BaseMap;

class StaticMap: public BaseMap
{
public:
  StaticMap ()
    : BaseMap ()
  {
    (*this) [ 0 ] = string ("ABC");
    (*this) [ 1 ] = string ("DEF");
    (*this) [ 2 ] = string ("GHI");
  }
  // 
  // *1
  //
  string& operator[] (const int& i)
  {
    return BaseMap::operator[] (i);
  }
  //
  // *2
  //
  int operator[] (const string& s) const
  {
    for (const_iterator i = begin (); i != end (); i++)
      if (i -> second == s)
        return i -> first;

    return - 1 ;
  }
};

int main(void)
{
  StaticMap aMap;
  string s = aMap [ 10 ];
  int k = aMap [string ("DEF")];
  
  return  0 ;
}
Так вот, если не описывать в нем _явно_ operator[] под нумером *1, летят ошибки:
Код: plaintext
1.
2.
error C2440: '=' : cannot convert from 'std::basic_string<_Elem,_Traits,_Ax>' to 'int'	c:\...\maptest.cpp  20 
error C2679: binary '[' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)	c:\...\maptest.cpp  21 
Если определить *1 - все OK. Но он ведь уже есть в шаблоне, вполне себе public... такое впечатление, что при разрешении overloaded оператора базовый класс вообще не рассматривается: нашли operator[] в производном и стоп, подходит не подходит - не компиляторские проблемы :)

Это что, так и должно быть и я чего-то не понимаю? Прошу прощения, если вопрос откровенно ламерский, я STL впервые увидел меньше двух недель назад, а на C писал последний раз лет пятнадцать тому :(
...
Рейтинг: 0 / 0
15.02.2007, 20:30
    #34334983
Помогите разобраться с operator overloading...
методы базового класса "скрываются" аналогичными именами наследника

используйте:
using BaseMap::operator[];

ps
ЕМНИП, шаблоны STL не предназначены для открытого наследования..
...
Рейтинг: 0 / 0
15.02.2007, 23:55
    #34335184
Полночный
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с operator overloading...
Голенков Владимирметоды базового класса "скрываются" аналогичными именами наследника

используйте:
using BaseMap::operator[];

ps
ЕМНИП, шаблоны STL не предназначены для открытого наследования..

О! Спасибо! Меня сбили с толку искаженные C++ имена. Я почему-то посчитал, что перекрытие определяется после формирования искаженного имени, с учетом типов параметров. Подумал - и правда, бред :)

Про "не предназначены для открытого наследования": можно намек, где про это почитать? У меня таких уже есть не два и не пять, переписывать не очень-то хочется, но и по граблям пройтись - удовольствие невеликое.
...
Рейтинг: 0 / 0
16.02.2007, 12:01
    #34336005
Помогите разобраться с operator overloading...
Про "не предназначены для открытого наследования": можно намек, где про это почитать? У меня таких уже есть не два и не пять, переписывать не очень-то хочется, но и по граблям пройтись - удовольствие невеликое.

у STL-контейнеров нет виртуальных методов
для полноценного открытого наследования необходим виртуальный деструктор базового класса
разумеется, при аккуратном обращении проблем не возникнет

поищите в гугле "STL container inheritance"
...
Рейтинг: 0 / 0
16.02.2007, 12:12
    #34336049
Полночный
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с operator overloading...
Голенков Владимиру STL-контейнеров нет виртуальных методов
для полноценного открытого наследования необходим виртуальный деструктор базового класса
разумеется, при аккуратном обращении проблем не возникнет
Спасибо. Буду разбираться.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите разобраться с operator overloading... / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]