【问题标题】:issue with "using namespace std;"“使用命名空间标准;”的问题
【发布时间】:2015-12-13 12:08:18
【问题描述】:

我有一个 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>c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility(364): error C2039: 'iterator_category' : is not a member of 'myPoint'
1> d:...\source.cpp(5) : 参见“myPoint”的声明
...

当我删除using namespace std; 并将cout &lt;&lt; distance(A, B) &lt;&lt; endl; 更改为 std::cout &lt;&lt; distance(A, B) &lt;&lt; std::endl; 我的程序成功了。

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

【问题讨论】:

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


【解决方案1】:

为什么我不能使用第一版的源代码?在哪里

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

错在哪里?

基本错误是说using namespace std;,尤其是如果您不知道标准库中的每个名称,过去未来。

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

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

【讨论】:

    【解决方案2】:

    你与std::distance冲突

    【讨论】:

      【解决方案3】:

      标准库中有一个std::distance,由于using namespace std;,它变得可见,并且似乎出于某种原因选择了它而不是您的版本。

      不要使用using namespace std;。如果您坚持,请不要使用听起来像普通英语单词的名称,因为它们可能会与库名称发生冲突。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        相关资源
        最近更新 更多