【问题标题】:No match for call to '(std::pair<unsigned int, unsigned int>) (unsigned int&, unsigned int)'不匹配调用 '(std::pair<unsigned int, unsigned int>) (unsigned int&, unsigned int)'
【发布时间】:2010-03-02 13:22:23
【问题描述】:

我不知道下面的代码有什么问题,它应该读取数字并将它们的值与位置放在一个成对的向量中,然后对它们进行排序并打印出位置。我用排序删除了该部分 - 我认为问题在那里,但我再次收到编译错误。

#include <iostream>                                                                                                           
#include <vector>                                                                                                             
#include <algorithm>                                                                                                          
#include <utility>                                                                                                            
using namespace std;                                                                                                          

int main(void)
{
        unsigned int n,d,a[65],b[65],s,i,j,t,us=0;
        pair<unsigned int,unsigned int> temp;
        vector< pair<unsigned int,unsigned int> > v;
        cin >> n;
        for(i=0;i<n;i++)
        {
                cin >> t;
                temp(t, i+1);
                v.push_back(temp);
        }
        cin >> d;
        for(i=0;i<d;i++) cin >> a[i] >> b[i];
        for(i=0;i<v.size();i++)
        {
                cout << v[i].first << " -- " << v[i].second << endl;
        }
        return 0;
}

请告诉我问题出在哪里。谢谢。

【问题讨论】:

  • 错误信息中的行号很重要也很有用。

标签: c++ vector std-pair


【解决方案1】:

如果您使用它的唯一位置是在该循环中,那么在循环外部创建变量并在循环中多次重复使用它通常是不好的形式。只有在建设成本很高并且重新分配比重新创建便宜时才这样做。通常 C++ 变量应该在它们使用的范围内声明,以便更容易阅读程序的每个部分并能够在以后重构它。

在您的情况下,我将完全删除对 temp 的引用,并将 push_back 调用更改为 v.push_back(make_pair(t, i+1))

【讨论】:

    【解决方案2】:

    问题是temp(t, i+1);

    第一个和第二个需要手动设置

    temp.first = t;
    temp.second = i + 1;
    

    或者,您可以在循环内声明 temp(可能我会这样做)。

    for(i=0;i<n;i++) 
    { 
        cin >> t; 
        pair<unsigned int,unsigned int> temp(t, i+1); 
        v.push_back(temp); 
    } 
    

    或者第二个替代方案,使用 make_pair 辅助函数,并完全取消 temp(感谢 KennyTM 的提醒)

    for(i=0;i<n;i++) 
    { 
        cin >> t; 
        v.push_back(make_pair(t, i+1)); 
    } 
    

    希望对你有帮助

    【讨论】:

    • 或者在循环对中构造变量 temp(t, i+1);
    • @KennyTM:我已经好多年没有愤怒地编写 C++ 代码了,并且已经忘记了关于 make_pair 的一切,谢谢。
    • Vaiols,这里是对问题的解释:编译器认为你试图在 temp 变量上调用 operator()。因此,它抱怨它找不到使用错误消息中提到的类型的参数调用该运算符的方法。仅允许在定义中使用括号初始化变量(对于局部变量,它也始终是声明)。在别处尝试该语法将被解释为operator() 调用。 std::pair 类没有这样的运算符。
    猜你喜欢
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 2017-09-10
    • 2014-04-05
    • 1970-01-01
    相关资源
    最近更新 更多