2012-10-17 4 views
1

안녕 내가 가지고있는 다음과 같은 클래스에서 템플릿 형식 정의를 사용 :C++ : 두 클래스

template<class T> 
class RandomTree<T> { 
private: 
    RandomTreeNode root; 
    typedef double (*funcion_ptr) (T, T); 

public: 
    RandomTree(std::vector<function_ptr> functions){...} 
}; 

template<class T> 
class RandomTreeNode<T> { 
private: 
    typedef double (*funcion_ptr) (T, T); 
    function_ptr function; 
public: 
    RandomTreeNode(function_ptr function){...} 
}; 

이 나무는 함수 포인터의 벡터를 부여하고 각 노드가 생성되고 하나 개의 특정 기능을 가지고 있습니다. 두 클래스에서 typedef double (*function_ptr) (T,T)을 정의 할 필요가없는 방법이 있습니까?

+0

클래스 정의에는 이름 뒤에 ''이 추가되어 있어야합니다. 클래스 템플릿 선언의 수정 된 구문에 대한 내 대답을 참조하십시오. – TemplateRex

답변

3

멤버 함수 포인터가 아닌 독립형 함수 포인터 유형을 선언 할 때 전역 피처 또는 네임 스페이스의 별도 템플릿 기반 클래스에 typedef를 넣을 수 있으므로 액세스 할 수 있습니다 두 클래스 다. 이처럼

는 :

template<class T> 
struct RandomTreeFunction 
{ 
    typedef double (*function_ptr)(T, T); 
}; 

template<class T> 
class RandomTree<T> { 
private: 
    typedef typename RandomTreeFunction<T>::function_ptr function_ptr; 
    ... 
}; 

나는 또한 대신 std::function를 사용하여 조사하는 것이 좋습니다. 당신이 RandomTreeNode<T>에 공개 할 경우

+0

은 MinGW g ++ 컴파일러에서 구현 된 std :: function입니까? 그것은 나를 위해 컴파일되고있는 것 같지 않습니다 – Aly

+1

아소서 우리는 typedef ** typename ** RandomTreeFunction :: function_ptr function_ptr를 입력해야합니다. 컴파일러는 멤버 변수가 아니라 중첩 된 유형을 알아야합니다. – Aly

0

당신은 말할 수 :

template<class T> 
class RandomTree<T> { 
    typedef RandomTreeNode<T>::funcion_ptr function_ptr; 
}; 

직접 RandomTreeNode<T>::funcion_ptr을 사용, 매우 지루한 것이다.

0

당신은 컴파일러에 acccess가있는 경우 (예를 들어 GCC는 = 4.7, 그 소리> = 3.0>), 요아킴 Pileborg에 의해 용액이 템플릿 별칭, 당신은 그렇지

#include <vector> 

template<class T> 
using function_ptr = double (*)(T,T); 

template<class T> 
class RandomTreeNode { 
private: 
    function_ptr<T> function; 
public: 
    RandomTreeNode(function_ptr<T> function){/*...*/} 
}; 

template<class T> 
class RandomTree { 
private: 
    RandomTreeNode<T> root; 

public: 
    RandomTree(std::vector<function_ptr<T>> functions){/*...*/} 
}; 

같은 것을 할 수있는 지원합니다 알맞은.