有人可以告诉我为什么我无法编译以下程序:
#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;
}
答案 0 :(得分:6)
distance
由标准库定义,您已经using
加入到全局命名空间中,所以它试图使用那个而不是您编写的那个(和期望的)。
调用您的函数以避免名称冲突。
同样的样式注释,在C ++代码#define
中通常可以用const或内联函数替换以提供更大的类型安全性,我喜欢为我需要的每个项目编写using std::cout
等而不是using namespace std
。
答案 1 :(得分:5)
您的代码至少存在3个问题,使其不合法C ++。有问题的是:
distance(pi[0],pi[1]); // This line is giving error
标准库中有distance
,编译器正在解析调用此标准库。这是因为您using namespace std
。最好不要using namespace std
,尤其是在标题中,但正如您所看到的那样,它也会导致问题。
有一些潜在的解决方案。
using namespace std
并限定您对标准库对象的所有使用(例如std::cin
)using namespace std
替换为特定的使用声明,仅引入您实际使用的StdLib中的那些部分(如using std::cin
)::distance(...);
编辑此外,这不是合法的C ++:
int N,i,j;
cin >> N;
pair<int,int> pi[N];
标准C ++只允许在编译时知道大小时声明C样式数组。您可能正在使用gcc工具来构建它,这就是它不会导致错误的原因。但是,您使用的是GCC特定的语言扩展,动态大小的数组,并且您编写的代码不是C ++语言本身的一部分。
答案 2 :(得分:2)
John Dibling对这个问题给出了很好的解释,但即使删除using namespace std;
也不够,因为距离是在同一个头中定义的,它会被解析为计算两个迭代器之间距离的函数。
我认为这是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;
}
答案 3 :(得分: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&#34;”的列表(或数组或向量)对,要做到这一点,我们可以使用矢量数据结构 像这样:
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<<“ “<<v[i].second<<endl;
上面的代码将列出一对存储在一个名为v的向量中的对。然后用各自的对打印出n个元素。
答案 4 :(得分: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;
}