问题"使用命名空间std;"

时间:2015-12-13 12:08:19

标签: c++ visual-studio-2012 namespaces

我在C ++中有一个源代码文件。这是:

#include <iostream>
using namespace std;

class myPoint
{
public:
    double x;
    double y;
    myPoint() {x=y=0;}
};

double distance(myPoint A, myPoint B)
{
    return (A.x - B.x);
}

int main()
{
    myPoint A, B;
    A.x=5; A.y=5;
    B.x=3; B.y=2;
    cout << distance(A, B) << endl;
    return 0;
}

我的编译器(Microsoft Visual Studio C ++ 2012)给出了以下错误:

  

...   
  1&gt; c:\ program files(x86)\ microsoft visual studio 11.0 \ vc \ include \ xutility(364):错误C2039:&#39; iterator_category&#39; :不是myPoint&#39;的成员。   
  1 GT; d:... \ source.cpp(5):见“myPoint&#39;   
  ...

当我删除using namespace std;时 并将cout << distance(A, B) << endl;更改为 std::cout << distance(A, B) << std::endl; 我的计划有效。

为什么第一个版本会给我一个错误?这是什么错误?

3 个答案:

答案 0 :(得分:3)

  

为什么我不能使用第一版的源代码?其中

因为您无意中从std命名空间(std::distance)中提取了与您定义的其他名称(distance)相同的名称。这会给你一个冲突。

  

错误在哪里?

根本的错误是说using namespace std;,特别是如果您不了解标准库中的每个名称,过去将来。

在您自己的命名空间中定义自己的名称也是有意义的。

namespace mystuff {
  class Point { ... };
  double distance(const Point& A, const Point& B);
}

答案 1 :(得分:2)

您与std::distance

发生冲突

答案 2 :(得分:2)

标准库中有一个std::distance因为using namespace std;而变得可见,似乎由于某种原因它被选中而不是你的版本。

请勿使用using namespace std;。如果你坚持,不要使用听起来像普通英语单词的名字,因为它们可能会与图书馆名称冲突。