C++:相同命名空间中类名的标识符未定义

罗兰德尚

我有两个类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 *)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章