首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ std::初始化向量并在头文件中设置

C++ std::初始化向量并在头文件中设置
EN

Stack Overflow用户
提问于 2013-11-13 15:29:52
回答 4查看 10K关注 0票数 2

目前,我遇到了一些问题,试图在代码中实现std::向量,而不是在头文件中使用数组。

在过去的一亿三千万年里,我在StackOverflow和谷歌上搜索过,找不到任何有用的东西。

简单地说,我一直在使用一个已经初始化并在头文件中设置的数组。使用std::vector转换此代码引起了一些问题。

我正在(cern)根中进行项目分析,它使用了许多显而易见的typedef,例如Int_t ==> int

其中一个导入的头文件自动调用using namespace std;,因此我刚刚停止了所有std::名称空间。

目前我有:

代码语言:javascript
复制
// 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):

代码语言:javascript
复制
// 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
// ...

现在,当我编译它(通过根编译,但不重要)时,我得到以下错误:

代码语言:javascript
复制
error: expected constructor, destructor, or type conversion before ‘.’ token

对于对应于push_back的每一行。

这在头文件中是可能的吗?出什么问题了?

我很感谢你的帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-11-13 15:36:13

Juanchopanza是对的,您不能在函数之外调用函数(如push_back)。您必须编写一个函数来初始化变量,如下所示:

代码语言:javascript
复制
//file.h

vector<Int_t> pdgCodeID;

void InitializeCodeID();

然后需要在cpp文件中定义函数,但是需要初始化变量。例如:

代码语言:javascript
复制
//file.cpp

void InitializeCodeID()
{
    pdgCodeID.push_back(    0); // other
    pdgCodeID.push_back(   22); // photon
    pdgCodeID.push_back(  111); // pi0
    // ...
}
票数 1
EN

Stack Overflow用户

发布于 2013-11-13 15:37:44

您不应该在头文件中定义任何一个,因为如果在多个源文件中包含头,则会得到多个定义错误。如果您真的想要全局的,那么在标题中声明它:

代码语言:javascript
复制
extern std::vector<Int_t> pdgCodeID;  // don't use namespace std

并在源文件中定义它:

代码语言:javascript
复制
std::vector<Int_t> pdgCodeID = /* initialiser */;

在C++11中,这很简单:您可以像使用数组一样使用大括号初始化。但是,由于不使用它的原因,最好的选择可能是使用函数的结果初始化它:

代码语言:javascript
复制
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年前的容器。

票数 4
EN

Stack Overflow用户

发布于 2013-11-13 15:37:41

不能在函数之外使用表达式语句。另外,将向量放置在标题中也是个坏主意。如果不使用push_back方法,而是使用initilaizer列表,则可以转义错误。例如

代码语言:javascript
复制
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
};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19957780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档