如何在不同文件中使用结构

sbl*_*yat 1 c++ struct namespaces function

我有一个在 header1.h 中声明的结构体 S,我需要在 header2.h 和 header2.cpp 中使用它(作为向量)。我相信我已经遵循了代码中已经存在的另一个类似示例,但我仍然收到错误,而且我不明白为什么。

这基本上是代码:

header1.h

#pragma once

namespace NSP
{
struct S{
float a;
int b;
};

class KPR
{
void funfun(int a); //struct S is used in funfun
}
}
Run Code Online (Sandbox Code Playgroud)

然后我有 header1.cpp

#include "header1.h"
using namespace KPR;
using namespace std;

void KPR::funfun(int a)
{
S thisVec;
}
Run Code Online (Sandbox Code Playgroud)

然后我有 header2.h

#pragma once
#include "header1.h"
namespace NSP{
class header2
{
public:
header2(void);
~header2(void);
int func(NSP::S thisVec);
};
}
Run Code Online (Sandbox Code Playgroud)

当然还有 header2.cpp

#include "anotherHeader.h"  //(a bunch of includes, amongst others #include header1.h)
header2::header2(void){
}
header2::~header2(void){
}
int header2::func(NSP::S thisVec)
{
}
Run Code Online (Sandbox Code Playgroud)

换句话说,

我遵循了 func 的另一个输入参数的结构,它也是一个结构,但在它自己的 .h 文件中声明(尽管具有相同的命名空间)。我通过使用 NSP::S 而不是 std::vectorNSP::S 稍微简化了问题,但它是相同的错误:此时,cpp 文件中的 func 下面有一个红色波形图,并且显示错误消息窗口func(.... thisVec ...) 而不是 NSP::S thisVec。我很困惑为什么会发生这种情况,有人可以解释一下发生了什么事吗?

use*_*570 5

问题是在实现 class 的成员函数时NSP::header2,您不在命名空间的范围内NSP。本质上,您是在全局名称空间中(错误地)实现它们。换句话说,如果选择在类外部定义成员函数,那么它们必须在定义该类的同一命名空间中实现。这意味着它们应该在NSP不是全局名称空间中实现。

解决此问题,请替换header2::header2NSP::header2::header2如下所示:

#include "header2.h" 
vvvvv------------------------->added this 
NSP::header2::header2(void){
}
vvvvv------------------------->added this
NSP::header2::~header2(void){
}
int NSP::header2::func(NSP::S thisVec)
{
}
Run Code Online (Sandbox Code Playgroud)

工作演示