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

标签 c++ compiler-errors static-members identifier derived-class

在使用新语言进行个人项目时,我遇到了一个恼人的编译时错误,其中我的constants.h(常量类)的静态成员找不到类名(Quark,它是一个派生类)粒子类,这两个在同一个文件“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中有我的 Quark 类定义

#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

这是我的预编译 header ,其中包括我的程序中所需的所有源(让您查看编译顺序)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"

我想知道我是否需要将我的 Particle 派生类分离到特定文件(这会增加很多文件......T-T),您对此有何看法?

这是我的类图(使用 Visual Studio 打开),可帮助您可视化整个项目:download it here via my dropbox

最佳答案

您的 header 中有循环依赖项。 Particle.h 包含 constants.h,而 constants.h 包含 Particle.h。您需要打破循环。

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

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

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

**我的想法可能是错的,因为你没有展示整个类(class)。

常量中依赖于Quark的部分(以及任何依赖于Quark的东西,递归地)分解成另一个类位于另一个 header 中,并且不要将该类包含在 Particle.h 中。或者断开 Particle.h 中依赖于 constants.h 的部分,并且不在 constants.h 中包含该部分。

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

关于C++ - 使用 vector <衍生类>的静态函数找不到声明的标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29685448/

相关文章:

c++ - Intel vs GCC on constexpr

c++ - 在 C++ 类之间共享实现

c++ - 是否允许主线程在进入 main() 之前生成 POSIX 线程?

c# - 在另一个方法内部有两种方法遇到麻烦

java - 如果出现错误则停止构建

c++ - 收集有关在程序中实例化哪些模板变体的信息

c++ - 为什么本地类中不允许使用静态数据成员?

c++ - C++ 对象的构造函数

c++ - GCC 用于 STL 的默认分配器是什么?

c - 将 C 代码从 HP-Unix 移动到 Linux 时替换 linux 中的 pstat.h