忽略候选模板:无法将"常量类型参数-0-0 *"与"字符"匹配

Candidate template ignored: could not match 'const type-parameter-0-0 *' against 'char'

本文关键字:类型参数 常量 -0-0 匹配 字符 候选      更新时间:2023-10-16

我想制作自己的库,但我对模板函数有一些问题。

主.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);