提问人:sblyat 提问时间:12/28/2022 最后编辑:sblyat 更新时间:12/28/2022 访问量:95
如何在不同的文件中使用结构体
How do I use a struct in a different file
问:
我有一个在header1.h中声明的结构S,我需要在header2.h和header2.cpp中使用(作为向量)。 我相信我已经遵循了代码中已经存在的另一个类似示例,但我仍然收到错误,我不明白为什么。
这基本上是代码:
标头1.h
#pragma once
namespace NSP
{
struct S{
float a;
int b;
};
class KPR
{
void funfun(int a); //struct S is used in funfun
}
}
然后我有标题1.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(....这个Vec ...而不是 NSP::S thisVec。 我摸不着头脑为什么会这样,有人可以解释一下发生了什么吗?
答:
5赞
user12002570
12/28/2022
#1
问题是在实现类的成员函数时,你不在命名空间的范围内。从本质上讲,您是在全局命名空间中(错误地)实现它们。换言之,如果选择在类外部定义成员函数,则必须在定义类的同一命名空间中实现这些函数。这意味着它们应该在全局命名空间中实现,而不是在全局命名空间中实现。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)
{
}
评论
0赞
sblyat
12/28/2022
我正在尝试这个,但这似乎不是主要问题;我没有收到与工作演示中相同的错误。header2.cpp 中的其他函数(不使用“NSP::S thisVec”)确实有效。在 header2.h 中,输入参数 struct NSP::S thisVec 在“S”下也有一个红色波浪线,但悬停在它上面时没有弹出窗口。将鼠标悬停在.cpp中带红色下划线的函数 func 上显示:“错误:声明与 func(..., <error-type>thisVec, ...) 不兼容(已在 header2.h 的第 101 行声明)”
0赞
user12002570
12/28/2022
@sblyat 请注意,文件中缺少类右大括号后面的分号。您应该添加该分号。;
header2.h
}
0赞
sblyat
12/28/2022
它在实际代码中,很抱歉忘记了这里
1赞
user12002570
12/28/2022
@sblyat 这就是为什么建议给出一个最小的可重复的例子。您可以提出一个新的单独问题。
0赞
user12002570
12/28/2022
@sblyat 您应该为后续问题提出一个新的单独问题,并附上一个最小可重复的示例。
评论
header2::header2
NSP::header2::header2
namespace NSP { header::header2() {} ... }
(void)
()