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.h
,constants.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
。您需要修复所有循环包含。
在使用新语言进行个人项目时,我遇到了一个烦人的编译时错误,我的 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.h
,constants.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
。您需要修复所有循环包含。