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 または inline 関数に置き換えて、より優れた型安全性を提供できます。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 宣言に置き換えてusing namespace std、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;ペアと同じヘッダーで距離が定義され、2 つの反復子間の距離を計算する関数として解決されるため、削除しても十分ではありません。

これは、あなたが達成しようとしていることを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 に答える