我是一个非常糟糕的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;
}
那我在哪里陷入困境?
答案 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;