2016-04-25 11 views
2

私自身のライブラリを作りたいと思いますし、テンプレート関数にいくつか問題があります。候補テンプレートが無視されました: 'const type-parameter-0-0 *'と 'char'は一致しません

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

また、あなたがコンパイルエラーを修正した後に発生します次の問題は、ありますリンカーエラー。コメントでπάνταῥεῖが述べたように、関数定義をヘッダファイルに移動する必要があります。

関連する問題