2017-01-24 3 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

두 번째 코드 스 니펫이 수정 *되지 않았습니다. – 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에 대한 함수 포인터 만 가져올 수 있습니다. 이 선언에서

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

:

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


당신이 함수 포인터가 Ktr 말을 말해봐, 당신은 단지 다음과 같이 foo의 인스턴스에 할당 할 수 있습니다 개체를 가져 오는 함수 포인터 형식의 variable template (C++14)을 선언했습니다. f 인수 T을 입력하십시오.

+0

그러나 다른 템플릿 내부에서 * foo 템플릿을 인스턴스화하고 포인터를 가져올 수 있습니다. 예 : '템플릿 클래스 usesFooPtr {void (* ptr) (U) = & foo }' – Caleth

+0

설명해 주셔서 감사합니다. –