我在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我很困惑为什么会发生这种情况,有人能解释一下是怎么回事吗?
1条答案
按热度按时间k5hmc34c1#
问题在于,当实现类
NSP::header2
的成员函数时,你不在命名空间NSP
的作用域中。(错误地)。换句话说,如果您选择在类之外定义成员函数,则它们必须在定义类的同一命名空间中实现**。这意味着它们应该在NSP
中实现,而不是全局命名空间。要解决此问题,请将
header2::header2
替换为NSP::header2::header2
,如下所示:Working demo