在源文件中定义类成员函数时,我们可以使用
例如:
然而,最近我在尝试定义一个全局函数时感到困惑。
请看以下示例。
我原本期望编译器会推断出在
using namespace ns1::ns2::...::nsx
来避免必须完全限定函数名称。例如:
// Header file - foo.hpp
namespace ns1::ns2 {
class FooClass {
void fooMethod();
}
}
// Source file - foo.cpp
#include "foo.hpp"
using namespace ns1::ns2;
void FooClass::fooMethod() {
// do something
}
然而,最近我在尝试定义一个全局函数时感到困惑。
请看以下示例。
// Header file - bar.hpp
namespace ns1::ns2{
void barFunction(); // <-- compile error: undefined reference
}
// Source file - bar.cpp
#include "bar.hpp"
using namespace ns1::ns2;
void barFunction(){
// do something
}
我原本期望编译器会推断出在
bar.hpp
中定义的ns1::ns2::barFunction
是bar.cpp
的定义。但实际上并没有推断出来。(如果我在定义中使用全限定名,一切都正常运作)。这种情况是否符合预期行为,或者说我做错了什么?
using namespace ns1::ns2
并不会导致后续对barFunction()
的定义在命名空间ns1::ns2
中。它意味着ns1::ns2
中现有的名称成为与barFunction()
中使用的名称匹配的候选项。 - Peterusing
:using namespace foo; using namespace bar;
;那么barFunction()
应该属于哪个命名空间?using namespace <someNamespace>
指令会导致在使用符号时,符号也会在所有已使用的命名空间中查找;并不是将定义放置在已使用的命名空间中。 - max66