Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ &引用;使用名称空间";用于定义全局函数_C++_Namespaces_C++17 - Fatal编程技术网

C++ &引用;使用名称空间";用于定义全局函数

C++ &引用;使用名称空间";用于定义全局函数,c++,namespaces,c++17,C++,Namespaces,C++17,在源文件中定义类成员函数时,我们可以使用使用名称空间ns1::ns2:::::nsx来避免完全限定函数名 例如 然而,我最近在尝试定义全局函数时陷入了困惑 请参见下面的示例 // Header file - bar.hpp namespace ns1::ns2{ void barFunction(); // <-- compile error: undefined reference } // Source file - bar.cpp #include "bar.hpp" u

在源文件中定义类成员函数时,我们可以使用
使用名称空间ns1::ns2:::::nsx
来避免完全限定函数名

例如

然而,我最近在尝试定义全局函数时陷入了困惑

请参见下面的示例

// 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{

void barFunction();//这是预期的行为

[namespace.udir]

using指令不会向声明性语句添加任何成员 它出现的区域

这意味着在定义时,全局命名空间中没有对
barFunction
的声明。这使得该定义成为此类函数(在全局命名空间中)的第一个也是唯一一个声明


这是出于设计,因为using指令通常会带来比预期更多的名称。因此,不让它践踏它出现在其中的声明性区域是好的。

您看到的行为与预期的一样-您的理解是错误的。
使用名称空间ns1::ns2
不会导致后续定义
barFunction()
位于名称空间
ns1::ns2
。这意味着
ns1::ns2
中的现有名称将成为匹配
barFunction()
中使用的名称的候选名称。您可以同时使用两个或多个
使用
使用名称空间foo;使用名称空间栏;
;哪个名称空间应该是
barFunction()
?使用名称空间的
指令导致在使用符号时,符号也会在所有使用的名称空间中查找;而不是在使用的名称空间中放置定义。
// 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
}