目前,我遇到了一些问题,试图在代码中实现std::向量,而不是在头文件中使用数组。
在过去的一亿三千万年里,我在StackOverflow和谷歌上搜索过,找不到任何有用的东西。
简单地说,我一直在使用一个已经初始化并在头文件中设置的数组。使用std::vector转换此代码引起了一些问题。
我正在(cern)根中进行项目分析,它使用了许多显而易见的typedef,例如Int_t ==> int。
其中一个导入的头文件自动调用using namespace std;,因此我刚刚停止了所有std::名称空间。
目前我有:
// file.h
// ...
const Int_t kNpdgCodes = 14;
Int_t pdgCodeID[kNpdgCodes] = {
0, // other
22, // photon
111, // pi0
-211, // pim
211, // pip
221, // eta
130, // K0L
310, // K0s
-321, // Km
321, // Kp
-2112, // (a)n
2112, // n
2212, // p
3122 // Lambda
};
// ...我正在尝试以形式获得它(或者更好,因为没有有用的=构造函数不能使用C++11):
// file.h
// ...
vector<Int_t> pdgCodeID;
pdgCodeID.push_back( 0); // other
pdgCodeID.push_back( 22); // photon
pdgCodeID.push_back( 111); // pi0
pdgCodeID.push_back( -211); // pim
pdgCodeID.push_back( 211); // pip
pdgCodeID.push_back( 221); // eta
pdgCodeID.push_back( 130); // K0L
pdgCodeID.push_back( 310); // K0s
pdgCodeID.push_back( -321); // Km
pdgCodeID.push_back( 321); // Kp
pdgCodeID.push_back(-2112); // (a)n
pdgCodeID.push_back( 2112); // n
pdgCodeID.push_back( 2212); // p
pdgCodeID.push_back( 3122); // Lambda
// ...现在,当我编译它(通过根编译,但不重要)时,我得到以下错误:
error: expected constructor, destructor, or type conversion before ‘.’ token对于对应于push_back的每一行。
这在头文件中是可能的吗?出什么问题了?
我很感谢你的帮助。
发布于 2013-11-13 15:36:13
Juanchopanza是对的,您不能在函数之外调用函数(如push_back)。您必须编写一个函数来初始化变量,如下所示:
//file.h
vector<Int_t> pdgCodeID;
void InitializeCodeID();然后需要在cpp文件中定义函数,但是需要初始化变量。例如:
//file.cpp
void InitializeCodeID()
{
pdgCodeID.push_back( 0); // other
pdgCodeID.push_back( 22); // photon
pdgCodeID.push_back( 111); // pi0
// ...
}发布于 2013-11-13 15:37:44
您不应该在头文件中定义任何一个,因为如果在多个源文件中包含头,则会得到多个定义错误。如果您真的想要全局的,那么在标题中声明它:
extern std::vector<Int_t> pdgCodeID; // don't use namespace std并在源文件中定义它:
std::vector<Int_t> pdgCodeID = /* initialiser */;在C++11中,这很简单:您可以像使用数组一样使用大括号初始化。但是,由于不使用它的原因,最好的选择可能是使用函数的结果初始化它:
std::vector<Int_t> make_pdgCodeID() {
std::vector<Int_t> result;
result.push_back(0);
// and so on
return result;
}
std::vector<Int_t> pdgCodeID = make_pdgCodeID();或者,Boost有一个图书馆,用于更笼统地初始化和分配2011年前的容器。
发布于 2013-11-13 15:37:41
不能在函数之外使用表达式语句。另外,将向量放置在标题中也是个坏主意。如果不使用push_back方法,而是使用initilaizer列表,则可以转义错误。例如
vector<Int_t> pdgCodeID = {
0, // other
22, // photon
111, // pi0
-211, // pim
211, // pip
221, // eta
130, // K0L
310, // K0s
-321, // Km
321, // Kp
-2112, // (a)n
2112, // n
2212, // p
3122 // Lambda
};https://stackoverflow.com/questions/19957780
复制相似问题