为什么C ++模板函数无法识别同一头文件中的函数

时间:2019-05-24 18:28:01

标签: c++ templates

这可能是一个可以追溯到对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;
}
// ================================================================

2 个答案:

答案 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而直接交换他们的位置。