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

标签 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 header 中的包含内容;
尝试这样的事情:

#pragma once

#include "SphericalLightProbe.h"

namespace SphericalHarmonics
{
    class SHCalculator
    {
    private:

    public:
        void Test();
        SphericalLightProbe Test2();
    };
}

Note that if your SHCalculator.cpp file includes above, the duplicate #include "SphericalLightProbe.h" line is not required.

但是,如果您出于某种原因想避免包含,请改用前向声明,例如:

#pragma once

namespace SphericalHarmonics {

class SphericalLightProbe;

// ...

} // namespace SphericalHarmonics

Note that forward declaration normally does not force you to switch to pointers (like SphericalLightProbe *).

关于C++:同一命名空间中类名的标识符未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68741991/

相关文章:

c++ - 我自己 pthread_join 是否可以接受并且安全?

c++ - 有一对 <string, string> 如何查找它是否属于 map<string, string> 中的某个对?

c++ - 如何在 OpenCL 中使用模板?

c++ - 在不同的Visual Studio版本中缺少.dll

c++ - GetOpenFileName() 正在干扰 SFML

c++ - MFC中如何保存数据?

c++ - Linux共享内存只允许读访问

c++ - 从 QThread 影响 QDialog

c++ - 如何仅使用其中一个维度在2D vector 中插入值?

c++ - Boost-asio 在单个 (TCP) 接受器上监听多个 IP 地址