实用程序功能不会在.h文件中初始化,也不会在main.cpp中定义

时间:2019-05-18 15:56:53

标签: c++ auto

我正在学习C ++,并且遇到了Sublime Text控制台调试器无法为我解决的问题。我有一个带有两个参数的stringify函数,一个const auto& arr和一个const std::string& ch。我希望能够在我的项目的每个.cpp文件中导入的main.h文件中对其进行初始化,以便它可用于全局范围。

我已经尝试了正常的操作方式,只是先在main.h中定义它,然后在main.cpp中填充其余内容

main.cpp

std::string stringify(const auto& arr, const std::string& ch)
{
    std::stringstream ss;
    unsigned i = 0;
    for (auto& element : arr) {
        ++i;
        // add element to s
        ss << element;
        // if element isnt the last one.
        (i != arr.size()) ? ss << ch : ss;
    }
    return ss.str();
}

main.h

#ifndef MAIN_H
#define MAIN_H

#include <iostream>
#include <string>
#include <sstream>
#include <array>
#include <vector>
#include <iterator>
#include <algorithm>

std::string stringify(const auto& arr, const std::string& ch);

#endif // MAIN_H

无论我尝试什么,我都会不断地因“未定义的函数引用”字符串而出错。除非,我将完整的函数定义放在main.h中。我在这里想念什么?我一直在阅读文档,似乎无法弄清楚。

2 个答案:

答案 0 :(得分:3)

请注意,在函数参数中使用auto,例如const auto& arr,目前不是标准C ++。它将在C ++ 20中有效,但是一些编译器已经将其作为扩展用于其他C ++版本。

但是,

它的实际作用是使函数成为函数模板,因为现在需要从函数参数中推导出参数的实际类型。所以声明

std::string stringify(const auto& arr, const std::string& ch);

本质上等同于

template <typename T>
std::string stringify(const T& arr, const std::string& ch);

由于函数的作用类似于模板,因此其定义必须位于头文件中,以便编译器可以在将其与新型arr一起使用时根据需要实例化它。 (请参见Why can templates only be implemented in the header file?

答案 1 :(得分:1)

当您将参数定义为auto时,编译器将在后台使用模板:

您的功能:

std::string stringify(const auto& arr, const std::string& ch);

等于:

template<class T>
std::string stringify(const T& arr, const std::string& ch);

并且需要定义模板函数(不仅要声明)。因此,可以选择在头文件中对其进行定义。