gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:03:38 25 4
gpt4 key购买 nike

我最近开始使用 c++ 和 opencv 进行图像处理。从一开始几乎每个示例代码都有 using namespace 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::只是为了习惯这样做?

最佳答案

另一个答案中提到了ADL。

这是它的工作原理:

在下面的示例中,请注意函数 show 已在命名空间 FooBar 中定义。

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

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

  • ::(全局命名空间)
  • 使用 using 命名空间将任何命名空间拉入 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

关于c++ - 所以我决定不再使用命名空间,但现在我应该什么时候添加 std::或 cv::?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46714585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com