我最近开始使用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 ::只是为了习惯这样做?
答案 0 :(得分:2)
这些功能由argument-dependent lookup找到。因此,它们位于cv
命名空间中,但编译器能够猜到这一点,因为(至少)其中一个参数的类型位于cv
命名空间中。
答案 1 :(得分:2)
另一个答案中提到了ADL。
以下是它的工作原理:
在下面的示例中,请注意已在命名空间show
和Foo
中定义了函数Bar
。
ADL允许编译器查看参数列表中提到的所有名称空间。
x1是Foo::X
所以在第一次调用show()
时,可能会检查以下命名空间:
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