gpt4 book ai didi

c++ - "using"定义成员函数和非成员函数时的关键字

转载 作者:行者123 更新时间:2023-12-04 16:59:43 26 4
gpt4 key购买 nike

“using”关键字在定义成员函数和非成员函数的上下文中是否有不同的效果?下面的示例代码向我表明它可能。
主程序

  #include "baz.h"
int main()
{
foo::bar x;
x.baz();
foo::foo_non_member();
}
baz.h
  namespace foo
{
class bar
{
public:
bar() = default;
void baz();
};

void foo_non_member();
};
baz.cpp
  #include "baz.h"
#include<iostream>

using namespace foo;
void bar::baz()
{
std::cout << "baz\n";
}

namespace foo
{
void foo_non_member()
{
std::cout << "non-member\n";
}
}
上面的代码编译并运行。
$> g++ main.cpp baz.cpp; ./a.out
baz
non-member
如果我删除 using namespace foo;从 baz.cpp,我得到一个编译器错误。
$> g++ main.cpp baz.cpp
baz.cpp:5:6: error: ‘bar’ has not been declared
void bar::baz()
如果我把那个 using声明返回并移动 foo_non_member() 的定义外 foo命名空间,我收到链接器错误。
$> g++ main.cpp baz.cpp
/tmp/ccHeSwsZ.o: In function `main':
main.cpp:(.text+0x24): undefined reference to `foo::foo_non_member()'
collect2: error: ld returned 1 exit status
为什么 using关键字在这里似乎对 bar::baz() 没有同样的效果和 foo_non_member() ?

最佳答案

对于这部分:

using namespace foo;
void bar::baz()
{
std::cout << "baz\n";
}
using namespace foo;用于查找 bar::部分,并且由于编译器能够绑定(bind) void bar::baz() 的定义到命名空间 foo 中的声明.
如果你删除 using namespace foo;找不到 bar .

If I put that using statement back in and move the definition of foo_non_member() outside of the foo namespace, I get a linker error.

void foo_non_member()
{
std::cout << "non-member\n";
}
这里 foo_non_memberbar::没有任何关系或任何其他(根据规范)允许编译器确定此定义与命名空间 foo 中的声明相关的任何内容.
标准委员会肯定可以在规范中添加一些规则,以允许编译器获得 foo_non_member定义和声明一起如果 using namespace foo;存在,但他们决定不这样做。
这样做的原因可能是因为您会对是否要定义新的 void foo_non_member() 产生歧义。命名空间之外 foo或者如果您想对 void foo_non_member() 进行定义的 foo .

关于c++ - "using"定义成员函数和非成员函数时的关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67615476/

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