c++:同一命名空间中类名的标识符undefined



我在单独的文件中有两个类SHCalculatorSphericalLightProbe。我将它们完全剥离以显示我得到的错误这是四个文件:

SHCalculator.h

#pragma once
namespace SphericalHarmonics
{
class SHCalculator
{
private:
public:
void Test();
SphericalLightProbe Test2();
};
}

SHCalculator.cpp

#include "pch.h"
#include "SphericalLightProbe.h"
#include "SHCalculator.h"    
namespace SphericalHarmonics
{
void SHCalculator::Test()
{
SphericalLightProbe sp(2, 3.4f);
for (int i = 0; i < sp.coeffs.size(); i++)
{
std::cout << sp.coeffs[i] << std::endl;
}
}
SphericalLightProbe SHCalculator::Test2()
{
SphericalLightProbe sp(2, 4.3f);
for (int i = 0; i < sp.coeffs.size(); i++)
{
std::cout << sp.coeffs[i] << std::endl;
}
return sp;
}
}

SphericalLightProbe.h

#pragma once
namespace SphericalHarmonics
{
class SphericalLightProbe
{
private:
public:
SphericalLightProbe() { }
SphericalLightProbe(int numCoeffs);
SphericalLightProbe(int numCoeffs, float value);
std::vector<Eigen::Vector3f> coeffs;
};
}

SphericalLightProbe.cpp

#include "pch.h"
#include "SphericalLightProbe.h"
namespace SphericalHarmonics
{
SphericalLightProbe::SphericalLightProbe(int numCoeffs)
{
coeffs.resize(numCoeffs);
}
SphericalLightProbe::SphericalLightProbe(int numCoeffs, float value)
{
coeffs.resize(numCoeffs, Eigen::Vector3f(value, value, value));
}
}
这给了我一堆错误:
C2238   unexpected token(s) preceding ';'
C2059   syntax error: '('
Message     see declaration of 'SphericalHarmonics::SHCalculator'   
E0020   identifier "SphericalLightProbe" is undefined   
C3646   'Test2': unknown override specifier 
C2039   'Test2': is not a member of 'SphericalHarmonics::SHCalculator'  

如果我通过注释删除Test2(),所有错误都会消失。我想知道为什么。

您缺少SHCalculator.h头中的包含;
尝试如下:

#pragma once
#include "SphericalLightProbe.h"
namespace SphericalHarmonics
{
class SHCalculator
{
private:
public:
void Test();
SphericalLightProbe Test2();
};
}

注意如果你的SHCalculator.cpp文件包含上述内容,则不需要重复#include "SphericalLightProbe.h"行。

但是,如果您出于任何原因想要避免包含,请使用前向声明,例如:

#pragma once
namespace SphericalHarmonics {
class SphericalLightProbe;
// ...
} // namespace SphericalHarmonics

注意前向声明通常不会强制您切换到指针(如SphericalLightProbe *)。

最新更新