无法设置std :: map元素?

时间:2014-08-07 16:09:25

标签: c++ clang std

我是一个非常糟糕的C ++程序员,但是为了工作,我必须将数字库从Python重写为C ++。 由于我有很多常量,我决定将它们存储在std::map中。 所以我有一个vector_dict.h文件,其中包含以下typedef(我使用armadillo库进行与矢量相关的计算):

namespace klib {
    typedef std::map<std::string, arma::vec> vector_dict; // a map of strings to vectors, used to store particle and interaction data
}

然后我有一个particledata.h文件,其中包含

#include "vector_dict.h"
namespace klib {
    extern klib::vector_dict atom_data;
    extern klib::vector_dict molecule_data;
}

并且particledata.cpp中的实现如下所示:

#include "particledata.h"

arma::vec klib::atom_data["N"] = arma::vec::fixed<4>();
double klib::atom_data["N"][0] = 14.0067;  // nitrogen atom mass, atomic mass units

我正在使用XCode(Apple LLVM版本5.1(clang-503.0.40)(基于LLVM 3.4)),它表明这两行都有错误:具体来说,它表示& #34;数组的大小具有非整数类型&#char; const char [2]&#39;。

为了测试发生了什么,我创建了一个单独的项目,其中所有内容都在一个文件中,以下代码编译得很好:

#include <iostream>
#include <armadillo>
#include <string>
#include <map>

int main(int argc, const char * argv[])
{
    typedef std::map<std::string, arma::vec> vector_dict;
    vector_dict vv;
    vv["N"] = arma::vec::fixed<4>();
    vv["N"][0] = 34.5;
    vv["N"][1] = 44.5;
    vv["N"][2] = 54.5;
    vv["N"][3] = 64.5;
    return 0;
}

那我在哪里陷入困境?

2 个答案:

答案 0 :(得分:3)

从您的代码段开始并不是很清楚,但看起来您可能会将这些代码放在particledata.cpp中,而不是在函数中。试试这个。

头文件:

namespace klib
{
    extern const klib::vector_dict atom_data;
}

源文件:

namespace
{
    klib::vector_dict create_atom_data()
    {
        klib::vector_dict atom_data;
        atom_data["N"] = arma::vec::fixed<4>();
        atom_data["N"][0] = 14.0067;
        return atom_data;
    }
}

extern const klib::vector_dict klib::atom_data = create_atom_data();

我制作地图const以防止它在创建后被修改,这可以防止意外。如果您确实想要在创建地图后修改地图,只需从上面的代码中删除consts。

答案 1 :(得分:2)

arma::vec klib::atom_data["N"] = arma::vec::fixed<4>();
double klib::atom_data["N"][0] = 14.0067; 

是错误的。 atom_data已经定义 - 在分配期间您不需要(甚至不能)指定类型。尝试

klib::atom_data["N"] = arma::vec::fixed<4>();
klib::atom_data["N"][0] = 14.0067;