2017-01-24 9 views
2

私はテンプレート関数へのポインタを作成したい:スコープ内のテンプレート関数へのポインタを作成できますか?

template <class T> 
void foo(T x){} 

int main() 
{ 


template <class T> 
void (*ptr)(T); 


    return 0; 
} 

私は上記のエラーを得た:私はグローバルスコープでテンプレート関数へのポインタを宣言することによってそれを修正することができ、それが正常に動作しますerror C2951: template declarations are only permitted at global or namespace scope

template <class T> 
void foo(T x){ cout << "foo()" << endl;} 

template <class T> 
void (*ptr)(T); 


int main() 
{ 

    ptr = foo; 
    (*ptr)(7); 

    return 0; 
} 
  • は、最初のコードのように範囲内のテンプレート関数へのポインタを宣言する方法はありますか?
+5

2番目のコードスニペットで修正*していません。 – WhiZTiM

+4

テンプレート関数は、ある種の型でインスタンス化されるまで存在しないので、関数テンプレートへのポインタは不可能です。しかし、 'foo ' – AndyG

+4

'テンプレート void(* ptr)(T);'のような特定のインスタンスへのポインタは、C++ 14以降の変数テンプレートになります。使用法は 'ptr = foo;'のようなものになります。 – Jarod42

答えて

10

関数テンプレート機能ありません。 ファンクションポインタは、一致するシグネチャの関数にのみ割り当てることができます。この宣言において

template <class T> 
void foo(T x){ cout << "foo()" << endl;} 

foo関数テンプレートあります。関数が生成される前にインスタンス化されるまで。したがって、fooのインスタンス化への関数ポインタしか取得できません。


Ktrを言う、あなただけのように以下のfooのインスタンス化に割り当てることができますが、関数ポインタを持って言ってやるがいい。この宣言で

void (*Ktr)(int); 
Ktr = foo<int>; 

template <class T> 
void (*ptr)(T); 

あなたは、オブジェクトを取る関数ポインタ型のvariable template (C++14)を宣言しました。 f型Tを唯一の引数として使用します。

+0

しかし、別のテンプレートの中で* fooテンプレートをインスタンス化し、それにポインタを置くことはできます。例えば。 'template class usesFooPtr {void(* ptr)(U)=&foo }' – Caleth

+0

ありがとうございました。 –

関連する問題