Подтвердить что ты не робот

Использование вектора в С++

У меня возникают проблемы со следующим кодом и я не могу понять, что не так.

#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;
}

Ошибка заключается в вызове функционального расстояния.

/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
4b9b3361

Ответ 1

Вы пытаетесь переопределить функцию std:: distance, попробуйте удалить "using namespace std" и квалифицировать cout и endl с помощью std::

#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;
}

Это заставит ваш код работать, но не рекомендуется иметь объявления "using namespace" перед определениями. Когда вы пишете свой код, вы должны избегать второго варианта, который показан здесь только как альтернатива вашему примеру кода.

Ответ 2

Как насчет

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

(другие ответы уже предлагают удалить директиву using).

Ответ 3

Не используйте using namespace std, когда вы создаете свою собственную функцию под названием distance, потому что ваш вызов distance ищет std::distance, а не вашу функцию distance.

Вы также можете сделать это:

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.
}

Ответ 4

В качестве альтернативы вы можете использовать

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

 (distance)(x,y); // the (parens) prevent ADL