как вставить парув очередь? - PullRequest
1 голос
/ 13 апреля 2011

У меня возникают проблемы при вставке объектов типа pair<int, int> в очередь.Я получаю странную ошибку, и я понятия не имею, как ее исправить.Кто-нибудь может помочь?Ниже приведен код метода, за которым следуют сообщения об ошибках.Первые две ошибки - для вставки, последняя - для использования operator=, помощь с этим тоже будет признательна.Спасибо!

pair<int,int>* bfSpanningTree(int theVertex)
{
    queue< pair<int,int> > pairq;
    queue<int> nodeq;
    if(linkedAdjacencyList[theVertex]->value == theVertex && linkedAdjacencyList[theVertex]->adj != NULL)
    {
        Node* whereto;
        whereto = linkedAdjacencyList[theVertex]->adj;
        while(whereto->adj != NULL)
        {
            pairq.push(pair< &whereto->value, &whereto->adj->value >);
            nodeq.push(whereto->value);
            whereto = whereto->adj;
        }
        while(!nodeq.empty())
        {
            whereto = linkedAdjacencyList[theVertex]->adj;
            while(whereto->adj != NULL)
            {
                pairq.push(pair<&whereto->value, &whereto->adj->value>);
                whereto = whereto->adj;
            }
        }
    }
    int i = 0;
    pair<int,int>* retVal;
    pair<int,int> tree[pairq.size()];
    while(!pairq.empty())
    {
        tree[i] = pairq.pop();
        i++;
    }
    retVal = tree;
    return retVal;
}

~UndirectedGraph()
{
    for (int i = 0; i < numVerticies; i++)
        delete[] linkedAdjacencyList[i];
}

ошибки:

hw8.h: 181: ошибка: неверное количество аргументов шаблона (1, должно быть 2)

/ usr/include/c++/4.4/bits/stl_pair.h:67: ошибка: предусмотрено для ‘template<class _T1, class _T2> struct std::pair’

hw8.h: 190: ошибка: неверное количество аргументов шаблона (1, должно быть 2)

/ usr / include / c ++ / 4.4 / bits / stl_pair.h: 67: ошибка: предоставляется для ‘template<class _T1, class _T2> struct std::pair’

hw8.h: 200: ошибка: нет соответствия для ‘operator=’ in ‘tree[i] = pairq.std::queue<_Tp, _Sequence>::pop [with _Tp = std::pair<int, int>, _Sequence = std::deque<std::pair<int, int>, std::allocator<std::pair<int, int> > >]()’

/ usr / include / c ++ / 4.4 / bits / stl_pair.h: 68: примечание: кандидаты: std::pair<int, int>& std::pair<int, int>::operator=(const std::pair<int, int>&)

Ответы [ 4 ]

7 голосов
/ 13 апреля 2011

Строки кода примерно так:

pairq.push(pair< &whereto->value, &whereto->adj->value >);

, вероятно, должны выглядеть следующим образом:

pairq.push(make_pair(whereto->value, whereto->adj->value));

или если члены value не относятся к типу int:

pairq.push(pair<int,int>(whereto->value, whereto->adj->value));

Наконец, queue::pop() ничего не возвращает, так что вы, вероятно, хотите:

tree[i] = pairq.front();
pairq.pop();
1 голос
/ 13 апреля 2011

Вы не можете сделать шаблон из реальных экземпляров объекта, как вы это сделали ... они должны быть ТИПАМИ для объектов, создаваемых функцией шаблона (в данном случае конструктором).

ИтакНапример, вы можете создать объект пары, используя конструктор, например:

pair<int, int>(whereto->value, whereto->adj->value)

, или вы можете создать пару, используя служебную функцию make_pair(), как показано Майклом.

Но если вы собираетесь использовать конструктор, вам нужно где-то объявить типы, которые заменят типы T1 и T2 в объявлении конструктора, т. Е.

template<typename T1, typename T2>
pair::pair(const T1& object_1, const T2& object_2);

это делается путем объявления объекта с аргументами шаблона для нужных типов объектов (т. е. для пары объектов int, вы бы использовали pair<int, int>), а затем вызова фактической функции-члена объекта с объектами этих типов (вв вашем случае это будет конструктор для класса pair).

1 голос
/ 13 апреля 2011

Посмотрите на make_pair () . queue :: pop () не возвращает первый элемент. Вам необходимо следующее:

tree[i] = pairq.front();
pairq.pop();
0 голосов
/ 13 апреля 2011

На первый взгляд, здесь происходит несколько вещей - можете ли вы предоставить определение класса / структуры Node?

  • В конце вы возвращаете указатель на автоматический (стек) элемент,который будет выходить за рамки.Вы, скорее всего, захотите вернуть по значению (в качестве альтернативы, выделить и вернуть указатель, предпочтительно общий, для элемента)
  • queue.pop () возвращает void - см. http://www.cplusplus.com/reference/stl/queue/pop/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...