Использование класса с базовым классом шаблона в качестве аргумента базового класса - PullRequest
1 голос
/ 21 января 2011

Я что-то здесь упускаю?или есть причина, по которой это не разрешено?

// the class declaration
class MapImage : public MapEntity, public Vector2D {};

// the variable declaration
std::vector<MapImage> healthpacks;

// the function
void DrawItems(SDL_Surface *dest, std::vector<Vector2D> &items, SDL_Surface *image);

// the implementation
DrawItems(dest, healthpacks, healthpack_image);

, поскольку аптечки являются std :: vector классов MapImage, а MapImage имеет базовый класс Vector2D, не должно быть "std :: vector healthpacks"совместим с "std :: vector & items", так как они имеют одинаковый базовый класс?

Ответы [ 2 ]

5 голосов
/ 21 января 2011

Нет.Вектор базового класса сам по себе не является базовым классом вектора производного класса.

Рассмотрим, вставил ли DrawItems объект Vector2D, который является не MapImage, в элементы:у вас будет что-то, что не является MapImage в векторе .Тем не менее, поскольку DrawItems имеет векторэта вставка была бы совершенно правильной с ее точки зрения.

Вместо этого передайте диапазон и шаблон итератора на итератор:

void DrawItem(SDL_Surface *dest, Vector2D &item, SDL_Surface *image);

template<class Iter>
void DrawItems(SDL_Surface *dest, Iter begin, Iter end, SDL_Surface *image) {
  for (; begin != end; ++begin) {
    DrawItem(dest, *begin, image);
  }
}

Или на контейнер:

template<class Container>
void DrawItems(SDL_Surface *dest, Container &items, SDL_Surface *image) {
  typename Container::iterator begin = items.begin(), end = items.end();
  for (; begin != end; ++begin) {
    DrawItem(dest, *begin, image);
  }
}

Или вместо DrawItems вообще, но все еще с DrawItem, как я объявил выше, возможно, используйте новомодный цикл for-each:

// this: DrawItems(dest, healthpacks, healthpack_image);
// becomes:
for (auto &x : healthpack) DrawItem(dest, x, healthpack_image);

Также кажется, что вам нужно добавить const, но я 'оставил код как у тебя.

1 голос
/ 21 января 2011

Ну, нет.

Конечно, вы можете выгружать карту из MapImage в Vector2D, но вектор <> не относится к типу. Ожидаете ли вы непосредственного рассмотрения или создания копии? Последнее не произойдет из-за неконстантной ссылки на вектор <>.

Почему? Поддержите, это были только массивы, итератор должен был бы знать размер записи, и это будет отличаться для разных типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...