候选模板被忽略:无法匹配' const type-parameter-0-0 *'反对' char'

时间:2016-04-25 15:40:11

标签: c++ arrays function templates

我想创建自己的库,我在模板功能方面遇到了一些问题。

的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;
}

有人可以向我解释为什么会出现这个错误吗?

2 个答案:

答案 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);
}

修复编译错误后您将遇到的下一个问题是链接器错误。正如πάνταῥεῖ在评论中所说,你需要将你的函数定义移动到头文件。