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

Только начал заниматься 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
Помогите разобраться с operator overloading...
    #34334983
методы базового класса "скрываются" аналогичными именами наследника

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

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

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

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

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

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

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

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


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