如何将pair <int,int =“”>插入队列?</int,>

时间:2011-04-13 02:06:39

标签: c++ templates

我无法将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=’中的‘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 个答案:

答案 0 :(得分:7)

代码行如下:

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 :(得分:1)

看看make_pair()queue::pop()不返回第一个元素。您需要以下内容:

tree[i] = pairq.front();
pairq.pop();

答案 2 :(得分:1)

你不能像你已经完成的那样从实际的对象实例中创建一个模板......对于由模板函数实例化的对象(在这种情况下是构造函数),它们必须是TYPES。

因此,例如,您可以使用如下构造函数创建一个对象:

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

或者您可以使用实用程序函数make_pair()进行配对,如Michael所示。

但是如果您要使用构造函数,则必须在某处声明将在构造函数声明中替换类型T1T2的类型,即

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

通过使用所需对象类型的模板参数声明对象(即,对于一对int对象,您将使用pair<int, int>),然后调用实际对象成员来完成函数与这些类型的对象(在您的情况下,它将是类pair的构造函数)。

答案 3 :(得分:0)

乍一看这里有一些事情 - 你能提供Node类/结构定义吗?

  • 您将在结尾处返回指向自动(堆栈)元素的指针,该指针将超出范围。您希望按值返回,最有可能(或者,为元素分配并返回指针,最好是共享)
  • queue.pop()返回void - 请参阅http://www.cplusplus.com/reference/stl/queue/pop/