c++ 如何在不同的文件中使用结构体

j9per5c4  于 2022-12-30  发布在  其他
关注(0)|答案(1)|浏览(282)

我在header1.h中声明了一个struct 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
}
}

那么我有header1.cpp

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

void KPR::funfun(int a)
{
S thisVec;
}

那么我有header2.h

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

当然还有标题2.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)
{
}

换句话说,
我已经遵循了func的另一个输入参数的结构,它也是一个结构,但在它自己的. h文件中声明(尽管名称空间相同)。我使用NSP::S而不是std::vectorNSP::S来简化问题,但它是相同的错误:此时,在cpp文件中的func下面有一个红色的曲线,错误消息窗口显示func(.... thisvec ...)而不是NSP::S thisvec。2我很困惑为什么会发生这种情况,有人能解释一下是怎么回事吗?

k5hmc34c

k5hmc34c1#

问题在于,当实现类NSP::header2的成员函数时,你不在命名空间NSP的作用域中。(错误地)。换句话说,如果您选择在类之外定义成员函数,则它们必须在定义类的同一命名空间中实现**。这意味着它们应该在NSP中实现,而不是全局命名空间。
解决此问题,请将header2::header2替换为NSP::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)
{
}

Working demo

相关问题