2016-04-25 68 views
2

我想製作我自己的庫,並且我有一些模板函數的問題。候選模板被忽略:無法與'char'匹配'const type-parameter-0-0 *'

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

能向我解釋人爲什麼我有這樣的錯誤?

+1

相關(而不是被問到的錯誤):http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file –

回答

1
void array_print(const T * array[], int size); 

請求一個指向數組的指針。當編譯器查看函數的調用方式時,它看到a這是一個不是指向數組的指針的數組。類型不匹配,所以模板扣除失敗。從功能解決這一下降的*所以你必須

void array_print(const T array[], int size); 
1

您可以從它的參數進行函數演繹數組大小:

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

也固定編譯錯誤後,你會遇到一個問題,就是鏈接器錯誤。正如評論中所說的,你需要將你的函數定義移動到頭文件中。