忽略候选模板:无法将"常量类型参数-0-0 *"与"字符"匹配
Candidate template ignored: could not match 'const type-parameter-0-0 *' against 'char'
我想制作自己的库,但我对模板函数有一些问题。
主.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;
}
有人可以向我解释为什么我有这个错误吗?
你可以让函数从它的参数推断数组大小:
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);
}
修复编译错误后,您将遇到的下一个问题是链接器错误。正如 πάντα ῥεῖ 在评论中所说,您需要将函数定义移动到头文件。
void array_print(const T * array[], int size);
请求指向数组的指针。 当编译器查看函数的调用方式时,它会看到a
哪个是数组而不是指向数组的指针。 类型不匹配,因此模板扣除失败。 要解决此问题,请从函数中删除*
,以便您拥有
void array_print(const T array[], int size);
相关文章:
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 如何解决一元"*"(有"字符")错误的无效类型参数?
- "std::shared_ptr":不是参数"_Ty"的有效模板类型参数
- 具有可变参数非类型参数的模板专用化
- 函数类型参数的模板参数推导
- 必须非常量别名参数及其默认参数常量
- PowerShell 使用结构类型参数调用 C++ DLL 的导出函数
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 为模板传递非类型参数 agument
- 为什么带有类型参数的运算符 () 可以应用于 result_of 上下文中的类型?
- 使用其他模板类型参数作为要在函数签名中使用的类型别名声明
- 如何避免具有相同类型参数的函数中的错误
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- c++非类型参数包扩展
- 忽略候选模板:推断参数的冲突类型:<常量 T &> 与 <T &>
- 忽略候选模板:无法将"常量类型参数-0-0 *"与"字符"匹配
- 在 c++11 中,当参数类型为常量左值引用与非常量左值引用时,函数模板类型推导的工作原理
- 限制函子参数类型和常量
- 模板非类型参数常量限制筛选器库