18

次のコードに問題があり、何が問題なのか理解できないようです

#include <iostream>
#include <cmath>
#include <vector>

using namespace std;

double distance(int a, int b)
{
    return fabs(a-b);
}

int main()
{
    vector<int> age;
    age.push_back(10);
    age.push_back(15);

    cout<<distance(age[0],age[1]);
    return 0;
}

エラーは関数distanceの呼び出しにあります。

/usr/include/c++/4.6/bits/stl_iterator_base_types.h: In instantiation of ‘std::iterator_traits<int>’:
test.cpp:18:30:   instantiated from here
/usr/include/c++/4.6/bits/stl_iterator_base_types.h:166:53: error: ‘int’ is not a class, struct, or union type
/usr/include/c++/4.6/bits/stl_iterator_base_types.h:167:53: error: ‘int’ is not a class, struct, or union type
/usr/include/c++/4.6/bits/stl_iterator_base_types.h:168:53: error: ‘int’ is not a class, struct, or union type
/usr/include/c++/4.6/bits/stl_iterator_base_types.h:169:53: error: ‘int’ is not a class, struct, or union type
/usr/include/c++/4.6/bits/stl_iterator_base_types.h:170:53: error: ‘int’ is not a class, struct, or union type
4

4 に答える 4

33

std::distance 関数をオーバーライドしようとしています。" using namespace std" を削除して修飾coutendlstd::

#include <iostream>
#include <cmath>
#include <vector>


double distance(int a, int b)
{
    return fabs(a-b);
}

int main()
{
    std::vector<int> age;
    age.push_back(10);
    age.push_back(15);

    std::cout<< distance(age[0],age[1]);
    return 0;
}

std::distance、指定された範囲内のコンテナー内の要素の数をカウントするために使用されます。詳細については、こちらをご覧ください。

std::または、名前空間を導入する場合は、距離関数の名前を変更できます。

#include <iostream>
#include <cmath>
#include <vector>

using namespace std;

double mydistance(int a, int b)
{
    return fabs(a-b);
}

int main()
{
    vector<int> age;
    age.push_back(10);
    age.push_back(15);

    cout<<mydistance(age[0],age[1]);
    return 0;
}

これによりコードが機能しますが、定義の前に「名前空間を使用する」宣言を行うことはお勧めしません。コードを記述するときは、2 番目のオプションを避ける必要があります。ここでは、コード例の代替としてのみ示しています。

于 2013-01-14T16:22:57.160 に答える
9

どうですか

cout<< ::distance(age[0],age[1]);

(他の回答はすでにusingディレクティブを削除することを提案しています)。

于 2013-01-14T16:23:49.977 に答える
4

using namespace stdと呼ばれる独自の関数を作成する場合は使用しないdistanceでください。への呼び出しは関数ではなくdistance検索を行うためです。std::distancedistance

これを行うこともできます:

namespace foo
{
  double distance(int a, int b)
  {
    return fabs(a-b);
  }
}

int main()
{
   foo::distance(x,y); //now you're calling your own distance function.
}
于 2013-01-14T16:21:49.067 に答える
0

または、使用することができます

 using foo::distance; // OR:
 using namespace foo;

 (distance)(x,y); // the (parens) prevent ADL
于 2013-01-14T16:39:26.637 に答える