我正在学习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中。我在这里想念什么?我一直在阅读文档,似乎无法弄清楚。
答案 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);
并且需要定义模板函数(不仅要声明)。因此,可以选择在头文件中对其进行定义。