gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:23:03 24 4
gpt4 key购买 nike

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

粒子.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

有我的预编译头,其中包括我程序中需要的所有源代码(让您看到编译顺序)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.hconstants.h包含Particle.h。你需要打破循环。

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

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

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

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

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

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com