我想创建自己的库,我在模板功能方面遇到了一些问题。
的main.cpp
#include <iostream>
#include "SMKLibrary.h"
int main() {
char a[5] = {"ASFD"};
array_print(a,5);
return 0;
}
SMKLibrary.h
#ifndef SMKLIBRARY_H
#define SMKLIBRARY_H
#include <iostream>
template <typename T>
void array_print(const T * array[], int size);
#endif
SMKLibrary.cpp
#include "SMKLibrary.h"
template <typename T>
void array_print(const T * array[], int size) {
int last = size - 1;
for (int i = 0; i < last; i++) {
std::cout << array[i] << " ";
}
std::cout << array[last] << std::endl;
}
有人可以向我解释为什么会出现这个错误吗?
答案 0 :(得分:4)
void array_print(const T * array[], int size);
请求指向数组的指针。当编译器查看函数的调用方式时,它会看到a
,它是一个数组而不是指向数组的指针。类型不匹配,因此模板推断失败。要解决此问题,请从函数中删除*
以便
void array_print(const T array[], int size);
答案 1 :(得分:4)
您可以使函数从其参数中推断出数组大小:
template <typename T, std::size_t size>
void array_print(T(&array)[size]) {
int last = size - 1;
for (int i = 0; i < last; i++) {
std::cout << array[i] << " ";
}
std::cout << array[last] << std::endl;
}
int main()
{
char a[5] = {"ASFD"};
array_print(a);
}
修复编译错误后您将遇到的下一个问题是链接器错误。正如πάνταῥεῖ在评论中所说,你需要将你的函数定义移动到头文件。