2012-05-12 10 views
0

私は本を読んで自分自身でC++を学び、その本から運動しようとしています。関数を.cppファイルの関数テンプレートにパラメータとして渡すときの宣言方法は?

今、私は関数テンプレートのインスタンスを.cppファイル内で宣言しようとしています。私は、ヘッダファイルにその関数テンプレートを宣言/定義することができますが、.cppファイル内でそれを行う方法についてはまだ興味があります。ここで

簡単ですが、私の問題を示すコードの一部です:

// temp_func.h 
#ifndef GUARD_temp_func 
#define GUARD_temp_func 

#include <iostream> 

using std::cout; using std::endl; 

int addone(int); 
int addtwo(int); 

template<typename F> 
void call_adds(int, F); 

#endif 

ヘッダファイル

// temp_func.cpp 
#include "temp_func.h" 

using std::cout; using std::endl; 

int addone(int n) 
{ 
    return n + 1; 
} 

int addtwo(int n) 
{ 
    return n + 2; 
} 

template<typename F> 
void call_adds(int n, F f) 
{ 
    cout << f(n) << endl; 
} 
template void call_adds<addone>(int n, F addone); 

.cppファイル、および明らかに最後の行は動作しません。

編集: n.m.で提供されるソリューションに基づく。

template<int F(int)> 
void call_adds(int n) 
{ 
    cout << F(n) << endl; 
} 
template void call_adds<addtwo>(int); 
template void call_adds<addone>(int); 

答えて

1

call_adsテンプレートには、タイプパラメータが必要です。 addoneは型ではなく、関数です。 int(int)のようなタイプにはcall_addsを特化できますが、そのタイプの個々の機能には特化することはできません。

あなたは非型テンプレートパラメータを持つ関数テンプレートを作成することができます、call_addsはもはや通常の関数のパラメータを持っていないことを

template<> void call_adds<addtwo> (int n) { ... } 

注:

template <int F(int)> 
void call_adds(int n) 
{ 
    cout << F(n) << endl; 
} 

をし、それを専門にテンプレートパラメータのみ。

コンパイラは、ヘッダーファイルまたはソースファイルに何かを宣言するかどうかは、宣言がどこにあるかがわかる限り、実際には気にしません。

+0

わかりません私は答えを完全に理解しています。タイプパラメータとして 'addone'を渡すことができないので、ヘッダーに関数テンプレートの定義を入れたくない場合は、提案した答えとしてテンプレートパラメータを使用する必要があります。 –

+0

また、最後の行を 'template <>'の代わりに 'template'に変更してコードを動作させる必要があります。 –

+0

いくつかの読書をした後、あなたはテンプレートの専門化の提案をしているようです。私はそれが必要とは思わない。私は 'Explicit instantiation'を必要とします。http://www.cplusplus.com/articles/1C75fSEw/ –