这可能是一个可以追溯到对C ++如何编译程序的基本理解的问题。我在.hpp
文件中定义了以下函数集。行keys = get_keys(inputs)
引起了问题。编译器给我以下错误消息Use of undeclared identifier 'get_keys'
。但是,get_keys()
定义在其正下方。我尝试在get_keys
文件中实现.cpp
函数,并只是在.hpp
文件中声明原型,因为它不是模板函数,但这也不起作用。为什么我不能使用此功能?
template <typename ...Funcs>
static std::tuple<std::vector<double>, std::vector<double>>
ode_solver(double step_size, double start, double stop, double error,
std::string func_name, std::map<std::string, double> &inputs,
Funcs&&... funcs)
{
std::vector<std::string> keys;
// THE COMPILER DOES NOT RECOGNIZE get_keys in the below line
keys = get_keys(inputs);
std::vector<double> one = {0.0, 1.0};
std::vector<double> two = {0.0, 1.0};
std::tuple<std::vector<double>, std::vector<double>> three(one, two);
return three;
}
// ================================================================
std::vector<std::string>
get_keys(std::map<std::string, double> & arr)
{
std::vector<std::string> keys;
for (typename std::map<std::string, double>::iterator it = arr.begin();
it != arr.end(); it++)
{
keys.push_back(it -> first);
}
return keys;
}
// ================================================================
答案 0 :(得分:1)
但是,
get_keys()
定义在其正下方。
有问题。您期待的并非如此。
根据经验,编译器需要在使用所有内容(类型,名称)之前对其进行声明。
实际上,这意味着声明需要在使用点上方(如果在同一源文件中),或在使用点上方#include
d的头文件中声明。
请注意,这是一条经验法则,因为有一些例外情况(例如,类的内联成员函数可以使用该类的数据成员,即使该成员的声明在类定义中位于其下方) 。您的示例不是这些例外之一。
您要么需要在使用点之前声明get_keys()
,要么将定义(这是一种声明类型)移到使用点之前。
答案 1 :(得分:0)
正如其他人提到的那样,添加一个get_keys
声明:
std::vector<std::string>
get_keys(std::map<std::string, double> &);
在定义ode_solver
之前,先被识别。
或者因为get_keys
不使用ode_solver
而直接交换他们的位置。