在使用新语言进行个人项目时,我遇到了一个恼人的编译时错误,其中我的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/