"using" 定义成员函数和非成员函数时的关键字
"using" keyword when defining member functions and non-member functions
在定义成员函数和非成员函数的上下文中,“using”关键字是否有不同的效果?下面的示例代码向我暗示它可能。
main.cpp
#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
如果我从 baz.cpp 中删除 using namespace foo;
,我会收到编译器错误。
$> 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::
部分,因此编译器能够将 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_member
与 bar::
或任何其他(根据规范)允许编译器确定此定义与命名空间 foo
.
标准委员会当然可以在规范中添加一些规则,以允许编译器在 using namespace foo;
存在的情况下将 foo_non_member
定义和声明放在一起,但他们决定不这样做不要这样做。
这样做的原因可能是因为您会不清楚是否要在命名空间 foo
之外定义一个新的 void foo_non_member()
,或者是否要为 void foo_non_member()
共 foo
。
在定义成员函数和非成员函数的上下文中,“using”关键字是否有不同的效果?下面的示例代码向我暗示它可能。
main.cpp
#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
如果我从 baz.cpp 中删除 using namespace foo;
,我会收到编译器错误。
$> 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::
部分,因此编译器能够将 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_member
与 bar::
或任何其他(根据规范)允许编译器确定此定义与命名空间 foo
.
标准委员会当然可以在规范中添加一些规则,以允许编译器在 using namespace foo;
存在的情况下将 foo_non_member
定义和声明放在一起,但他们决定不这样做不要这样做。
这样做的原因可能是因为您会不清楚是否要在命名空间 foo
之外定义一个新的 void foo_non_member()
,或者是否要为 void foo_non_member()
共 foo
。