单独的块中的命名空间声明。哪个是函数参数的正确语法?

时间:2016-04-29 07:49:34

标签: c++ namespaces

//SomeStruct.h
namespace SomeNameSpace
{
    typedef struct SomeStruct
    {
        int SomeVariable;
    } SomeStruct, *PSomeStruct;

}

//Function.h
namespace SomeNameSpace
{
    Function( SomeStruct smStr );
}

然后

//Function.cpp
#include "some_path_with_both_headers.h"
void SomeNameSpace::Function( SomeStruct smStr )
{ 
  ...
}

而不是

//Function.cpp
#include "some_path_with_both_headers.h"
void SomeNameSpace::Function( SomeNameSpace::SomeStruct smStr )
{ 
  ...
}

这样参数就是命名空间SomeNameSpace中的结构。第一个Function.cpp是正确的语法吗?

2 个答案:

答案 0 :(得分:2)

你也可以这样做:

//Function.cpp
#include "some_path_with_both_headers.h"
namespace SomeNameSpace
{
    void Function( SomeStruct smStr )
    { 
        ...
    }
}

答案 1 :(得分:1)

您可以使用这两个版本,后者更详细。

编译器已经知道Function的命名空间,现在遇到了一个它不知道的类型。所以它在相同的命名空间中开始搜索并找到SomeStruct,一切都很好。如果它找不到它,它将在命名空间树中更高,直到它到达全局命名空间。

这称为argument-dependent lookup(ADL),它不仅适用于名称空间,也适用于类。