所以我决定不再使用命名空间,但现在什么时候应该添加std ::或cv ::?

时间:2017-10-12 16:27:13

标签: c++ opencv visual-studio-2015

我最近开始使用c ++和opencv进行图像处理。从一开始几乎每个示例代码都使用了命名空间std;在标题中。在阅读之后,我看到建议不要使用命名空间,因为当两个库具有相同的函数名时它会导致问题。

所以我改变它并使用cv ::和std ::每当我收到错误但仍然有来自opencv的函数没有错误我认为这是因为只有一个函数具有该名称。但是我应该为每个函数添加标识符,即使这不会导致错误吗?

例如

cv::Mat antif;
idft(complexI, antif);
split(antif, planes);
magnitude(planes[0], planes[1], antif);
normalize(antif, antif, 0, 1, cv::NORM_MINMAX);

我正在使用傅里叶变换测量两个图像之间的相位差。  在制作变量antif时我不得不添加cv ::。但opencv中包含的任何以下函数都没有弹出错误。

这是因为这个问题只有一个实例,或者我应该添加cv ::只是为了习惯这样做?

2 个答案:

答案 0 :(得分:2)

这些功能由argument-dependent lookup找到。因此,它们位于cv命名空间中,但编译器能够猜到这一点,因为(至少)其中一个参数的类型位于cv命名空间中。

答案 1 :(得分:2)

另一个答案中提到了ADL。

以下是它的工作原理:

在下面的示例中,请注意已在命名空间showFoo中定义了函数Bar

ADL允许编译器查看参数列表中提到的所有名称空间。

x1是Foo::X所以在第一次调用show()时,可能会检查以下命名空间:

  • ::(全局命名空间)
  • 使用using namespace
  • 将任何名称空间拖入Foo
  • 使用using namespace将任何命名空间拉入全局命名空间(这就是为什么我们不在全局命名空间中使用using namespace

#include <iostream>

namespace Foo
{
    struct X{};
    void show(X const&)
    {
        std::cout << "a Foo::X" << std::endl;
    }
}

namespace Bar
{
    struct X{};
    void show(X const&)
    {
        std::cout << "a Bar::X" << std::endl;
    }
}

int main()
{
    auto x1 = Foo::X();
    auto x2 = Bar::X();

    show(x1);
    show(x2);
}

预期产出:

a Foo::X
a Bar::X