Толкая элемент в вектор - PullRequest
0 голосов
/ 23 мая 2011
template <class T>
class A{
    //...
};

class B{
    //...
};

class C{
    protected:
    vector< A<B> > vec;
    public:
    void f(B *ptr);      
};

C::f(B *ptr){
    vec.push_back(ptr); // gives error
}

Строка, в которой я пытаюсь добавить элемент в вектор, выдает ошибку компилятора.Как я могу это исправить?

Ответы [ 8 ]

6 голосов
/ 23 мая 2011

Вы не можете вставить элемент типа B* в вектор, предназначенный для элементов A<B>. Чего ты хочешь достичь?

Если вы просто хотите, чтобы он компилировался, тогда (при условии, что B копируемый):

  1. Объявите свой вектор как vector<B>.

  2. Использовать push_back(*B). Обратите внимание, что это не pushback.

3 голосов
/ 23 мая 2011

Ожидается A, вы даете ему B

A<B> a;
a.initsomehowwith(*ptr);
vec.push_back(a);
1 голос
/ 23 мая 2011

Я думаю, что вы можете захотеть что-то вроде этого:

void C::f(B &ptr){  // reference not a pointer
    A<B> b_in_a(B) ;
    vec.push_back(b_in_a); // gives error
}

Убедитесь, что операторы копирования, присваивания и сравнения являются ПОЛНОСТЬЮ реализуемыми, если в каком-либо шаблоне контейнера вы используете что-то кроме указателя. Также помните, что если вы не используете указатели, вы не можете хранить подклассы в своих контейнерах.

1 голос
/ 23 мая 2011

Разбирая свой дизайн. Что вы на самом деле пытаетесь сделать здесь? У вас есть вектор A<B>, но вы пытаетесь вставить указатель на B. Вы надеетесь на какое-то преобразование? Ваш код принципиально не имеет смысла.

0 голосов
/ 23 мая 2011

Сначала ваш вектор хранит элементы типа A<B>, а не B*.Во-вторых, это push_back не откат назад.

0 голосов
/ 23 мая 2011

vec не принимает значения типа B*, оно определено как A<B>. Вы можете переопределить vec как:

vector< B* > vec;
0 голосов
/ 23 мая 2011

Две ошибки:

  • push_back принимает подчеркивание.
  • У вас нет функции, которая преобразует B* в A<B>
0 голосов
/ 23 мая 2011

В соответствии с ссылкой метод называется push_back и принимает ссылку, а не указатель.

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