C++ - 使用 vector<derivedclass> 的静态函数找不到已声明的标识符

C++ - Static function using vector<derivedclass> don't find declared identifier

在使用新语言进行个人项目时,我遇到了一个烦人的编译时错误,我的 constants.h(常量 class)的静态成员找不到class 参数中使用的名称(夸克 class 粒子,这两个在同一文件中 "Particle.h")...

编译错误输出如下:

1>f:\bibliotheques\documents\visual studio 2013\projects\particlefuzzer\launcher\constants.h(41): error C2065: 'Quark' : undeclared identifier
1>f:\bibliotheques\documents\visual studio 2013\projects\particlefuzzer\launcher\constants.h(41): error C2923: 'std::vector' : 'Quark' is not a valid template type argument for parameter '_Ty'
1>f:\bibliotheques\documents\visual studio 2013\projects\particlefuzzer\launcher\constants.h(45): error C2065: 'Quark' : undeclared identifier
1>f:\bibliotheques\documents\visual studio 2013\projects\particlefuzzer\launcher\constants.h(45): error C2923: 'std::vector' : 'Quark' is not a valid template type argument for parameter '_Ty'
1>f:\bibliotheques\documents\visual studio 2013\projects\particlefuzzer\launcher\constants.h(45): error C3861: 'Quark': identifier not found
1>f:\bibliotheques\documents\visual studio 2013\projects\particlefuzzer\launcher\constants.h(45): error C2514: 'std::vector' : class has no constructors
1>f:\bibliotheques\documents\visual studio 2013\projects\particlefuzzer\launcher\constants.h(46): error C2663: 'std::vector<_Ty,_Alloc>::vector' : 8 overloads have no legal conversion for 'this' pointer
1>f:\bibliotheques\documents\visual studio 2013\projects\particlefuzzer\launcher\constants.h(50): error C2065: 'Quark' : undeclared identifier
1>f:\bibliotheques\documents\visual studio 2013\projects\particlefuzzer\launcher\constants.h(50): error C2923: 'std::vector' : 'Quark' is not a valid template type argument for parameter '_Ty'
1>f:\bibliotheques\documents\visual studio 2013\projects\particlefuzzer\launcher\constants.h(50): error C3861: 'Quark': identifier not found
1>f:\bibliotheques\documents\visual studio 2013\projects\particlefuzzer\launcher\constants.h(50): error C2514: 'std::vector' : class has no constructors
1>f:\bibliotheques\documents\visual studio 2013\projects\particlefuzzer\launcher\constants.h(51): error C2663: 'std::vector<_Ty,_Alloc>::vector' : 8 overloads have no legal conversion for 'this' pointer

这里是崩溃代码: constants.h

#pragma once
#include "stdafx.h"
#include <vector>
#include "Particle.h"

class constants
{
public:

    static enum nucl
    {
        proton = 0
        ,neutron = 1
    };

    static std::vector<Quark> getNuclVal(nucl type)
    {
        if (type == nucl::proton)
        {
            std::vector<Quark> result({ Quark(std::string("up")), Quark(std::string("up")), Quark(std::string("down")) });
            return result;
        }
        else
        {
            std::vector<Quark> result({ Quark(std::string("up")), Quark(std::string("down")), Quark(std::string("down")) });
            return result;
        }
    };
// More functions and constants
};

Particle.h

#pragma once
#include <vector>
#include "Entity.h"
#include "constants.h"

class Particle : public Entity
{
private:
// some stuff
public:
// some stuff
};

class Quark : public Particle
{
public:
    Quark(std::string &const);
};

并且在 Particle.cpp

中有我的夸克 class 定义
#include "stdafx.h"
#include "Particle.h"
#include "constants.h" 
#include <string>
#include "Entity.h"

Particle::Particle(std::string &const name, Size size)
: Entity::Entity()
, m_charge(0) //en e
, m_mass(0) //en electron Volt (eV)/c²
, m_Size(size)
, m_name(name)
{
};

Quark::Quark(std::string &const name) // declaration stuff
    : Particle(name, Size::Sub_Atomic)
{
    constants::quark type = constants::getQuarkByName(m_name);
    setMass(constants::getMass(type));
    setCharge(constants::getCharge(type));

}

// various stuffs

有我的预编译头文件,其中包括我程序中需要的所有源代码(让您看到编译顺序)stdafx.h

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>
#include <vector>
#include <iostream>
#include <cstdlib>
#include <string>


// TODO: reference additional headers your program requires here
#include "Math.h"

#include "SciNumber.h"
#include "PhyEngine.h"
#include "Options.h"
#include "ConfigFile.h"
#include "Chameleon.h"
#include "Entity.h"
#include "Particle.h"
#include "constants.h"

我想知道我是否需要将我派生的classes的Particle分离到特定的文件中(它会添加很多文件..... T-T),你怎么看?

这是我的 class 图表(用 Visual studio 打开)来帮助您可视化整个项目:download it here via my dropbox

尝试移动

#include "constants.h"

Particle.h 的底部。当前发生的是 Particle.h 在声明类型之前经过 constants.h

constants.h 不会重新包含 particle.h 因为 pragma #once(没有它你会有循环依赖,无论如何都不会工作)。

您也不需要 stdafx.h 中的 #include "constants.h",因为它已包含在 Particle.h

希望对您有所帮助!

您的 header 中存在循环依赖。 Particle.h 包括 constants.hconstants.h 包括 Particle.h。你需要打破循环。

您收到错误是因为当包含 Particle.h 时,它首先会包含 constants.h。然后 constants.h 将尝试包含 Particle.h#pragma once 将防止无限递归,但也意味着 Particle.h 的其余部分尚未包含在 constants.h 的内容之前。因此编译器会抱怨缺少声明。

您应该能够通过将 header 和可能的 class 分成更小的部分来打破循环*。 constants 的静态成员函数彼此之间并不严格相关,是吗?事实上,据我所见,它应该是一个命名空间而不是 class**。命名空间中的内容可以方便地在单独的 header 中声明,而 class 必须完全在一个

中定义。

*假设您确实需要。如果 Particle.h 不依赖于 constants.h,则只需删除包含。

**我可能错了,因为你没有展示整个 class。

constants 中依赖于 Quark 的部分(以及任何依赖于 Quark 的任何东西递归地)分解为另一个 class header 并且不要将那个包含在 Particle.h 中。或中断 Particle.h 中依赖于 constants.h 的部分并且不将其包含在 constants.h.

stdafx.h 还包括 constants.h,后者又包括 stdafx.h。您需要修复所有循环包含。