2

有人可以告诉我为什么我无法编译以下程序:

#include<iostream>
#include<string>
#include<cmath>
#include<iostream>
#include<cfloat>
#define MOD 10000009

using namespace std;

double distance(pair<int,int> p1,pair<int,int> p2)
{
    double dist;
    dist = sqrt( (p1.first-p2.first)*(p1.first-p2.first) + (p1.second-p2.second)*(p1.second-p2.second) );
    return(dist);
}

int main()
{
        int N,i,j;
        cin >> N;
        pair<int,int> pi[N];
        for(i=0;i<N;i++)
        {
            cin >> pi[i].first >> pi[i].second;
        }

        for(i=0;i<N;i++)
        {
            cout << pi[i].first << " "<< pi[i].second << endl;
        }

        distance(pi[0],pi[1]); // This line is giving error

    return 0;
}

在此处输入图像描述

4

5 回答 5

6

distance由标准库定义,您已经将其using编入全局命名空间,因此它尝试使用该标准库,而不是您编写的(和预期的)。

调用其他函数以避免名称冲突。

同样就像样式注释一样,在 C++ 中代码#define通常可以替换为 const 或内联函数以提供更大的类型安全性,并且我喜欢为using std::cout我需要的每个项目编写 , 等等而不是using namespace std.

于 2012-11-14T17:01:54.240 回答
5

您的代码至少有 3 个问题使其不合法 C++。有问题的是这样的:

distance(pi[0],pi[1]); // This line is giving error

标准库中有一个distance,编译器正在解析调用它。这是由于您这样做using namespace std。最好根本不做using namespace std,尤其是在标题中,但正如您所看到的,它在这里也造成了问题。

有一些潜在的解决方案。

  1. 删除using namespace std并限定您对标准库对象的所有使用(如std::cin
  2. 将 替换为using namespace std特定的 using 声明,仅从 StdLib 中引入您实际使用的那些部分(如using std::cin
  3. 更改远程调用以显式引用全局命名空间: ::distance(...);

编辑此外,这不是合法的 C++:

int N,i,j;
cin >> N;
pair<int,int> pi[N];

标准 C++ 仅允许在编译时知道大小时声明 C 样式的数组。您可能正在使用 gcc 工具来构建它,这就是它不会导致错误的原因。但是,您使用的是 GCC 特定的语言扩展、动态大小的数组,并且您编写的代码并不是 C++ 语言本身的一部分。

于 2012-11-14T16:58:40.990 回答
2

John Dibling 很好地解释了这个问题,但即使删除using namespace std;也不够,因为距离与 pair 在同一个标​​头中定义,并且它被解析为计算两个迭代器之间距离的函数。

我认为这是您尝试实现的 C++ 中的最小重写

#include <iostream>
#include <utility>
#include <vector>

typedef std::pair<int,int> intPair;
typedef std::vector<intPair> vectorPairs;

double Distance2D(const intPair& p1, const intPair& p2)
{
    double dist;
    dist = sqrt( (p1.first-p2.first)*(p1.first-p2.first) + (p1.second-p2.second)*(p1.second-p2.second) );
    return(dist);
}

int main()
{
    int numEntries;
    std::cin >> numEntries;
    vectorPairs pairs(numEntries);
    for(vectorPairs::iterator itor = pairs.begin(); itor != pairs.end(); ++itor)
    {
        std::cin >> itor->first >> itor->second;
    }
    for(vectorPairs::iterator itor = pairs.begin(); itor != pairs.end(); ++itor)
    {
        std::cout << itor->first << " " << itor->second << std::endl;
    }

    if(pairs.size() >= 2) // need to validate that 0 and 1 and within the range of pairs
    {
        double dist = Distance2D(pairs.at(0), pairs.at(1)); 
        std::cout << dist;
    }
    return 0;
}
于 2012-11-14T17:18:52.470 回答
0

C++中pair的用法

pair<some_datatype, some_other_datatype> my_pairs;

上面的行将使第一个元素与第二个元素成对,现在你可以像这样使用这个对:

pair<int,int> my_pairs;
my_pairs  = make_pair(5,6);
cout<<my_pairs.first<<" "<<my_pairs.second<<endl;

现在假设您要创建“n”对的列表(或数组或向量),为此我们可以使用这样的向量数据结构:

typedef pair<some_datatype,some_other_datatype> my_pairs;
vector<my_pairs> v;

for(int i=0; i<n; i++)
{
    int j,k;
    cin>>j>>k;
    v.push_back(make_pair(j,k));
}

for(int i=0; i<n; i++)
    cout<<v[i].first<<“ “&lt;<v[i].second<<endl;

上面的代码将创建一个对的列表,这些对将存储在一个名为 v 的向量中。然后将 n 个元素与它们各自的对一起打印出来。

于 2015-03-20T10:16:49.350 回答
0

您必须使用参考变量作为距离函数的参数。正确的代码如下:

#include<bits/stdc++.h>
#define MOD 10000009

using namespace std;

double distance(const pair<int,int> &p1, const pair<int,int> &p2)
{
   double dist;
   dist = sqrt((p1.first-p2.first)*(p1.first-p2.first) + (p1.second-p2.second)*(p1.second-p2.second));
   return dist;
}

int main()
{
        int N,i,j;
        cin >> N;
        pair<int,int> pi[N];
        for(i=0;i<N;i++)
        {
            cin >> pi[i].first >> pi[i].second;
        }

        for(i=0;i<N;i++)
        {
            cout << pi[i].first << " "<< pi[i].second << endl;
        }

        cout<<distance(pi[0],pi[1]); 

      return 0;
}
于 2018-09-07T17:21:15.573 回答