2016-06-14 2 views
0

그래서 함수 포인터의 배열을 저장할 수있는 Delegate 클래스가 있습니다. Player.cpp에서함수 포인터의 배열 (멤버 함수 포함) 템플릿 특수화 오류가 발생했습니다

template<typename Func> 
class delegate 
{ 
private: 
public: 
    typename std::vector<Func> mListOfFunctions; 
    void Bind(Func f) 
    { 
     mListOfFunctions.push_back(f); 
    } 
    template<typename...TArgs> 
    void Invoke(TArgs&&...arg) 
    { 
     for (auto f : mListOfFunctions) 
     { 
      f(std::forward<TArgs>(arg)...); 
     } 
    } 
}; 

사용법 : :이 코드는이 오류 C2893가 발생합니다

delegate<void(float)> testDelegate; 
testDelegate.Bind(std::bind(&Player::MoveLeft,this)); 

(오류 C2893 기능 템플릿을 전문으로하지 못했습니다 '알 수없는 형 표준 : 호출 (_Callable & &) ') ...

을 & & _Types하지만 난 다음에 바인딩의 정의를 변경할 때 :

,
template<typename F>  
void Bind(F f) 
    { 

    } 

잘 작동하지만 벡터에 함수 객체를 푸시하면 동일한 오류가 다시 발생합니다. 해결 방법이 있습니까? 전달 된 포인터를 캐쉬해야합니다.

답변

0

결과는 std::bind입니다 (결과는 지정되지 않은 유형의 함수 객체입니다). 나는 그것을 변경

template<typename Func> 
class delegate 
{ 
private: 
public: 
    typename std::vector<std::function<Func>> mListOfFunctions; 
    void Bind(std::function<Func> f) 
    { 
     mListOfFunctions.push_back(f); 
    } 
    template<typename...TArgs> 
    void Invoke(TArgs&&...arg) 
    { 
     for (auto f : mListOfFunctions) 
     { 
      f(std::forward<TArgs>(arg)...); 
     } 
    } 
}; 
+0

다음과 여전히 오류가 발생합니다 : 무효 바인딩 (표준 : 기능을 <당신이 std::forward를 사용하고 있기 때문에, 당신은 std::function 사용할 수있는 의미있는 C++ (11)를 사용하고 있어야합니다 returnType (TArgs ...)> f) \t { \t \t mListOfFunctions.push_back (f); \t} –

+0

왜 그렇게하고 있습니까? 내가 게시 한 코드를 사용하지 않는 이유는 무엇입니까? –

+0

는 내가 한 너무 : 템플릿 <유형 이름 Func을> 클래스 위임 { 개인 : 공공 : \t 유형 이름의 표준 : : 벡터 <표준 : 기능 > mListOfFunctions; \t 공극 귀속 (표준 : 함수 F) { \t \t \t mListOfFunctions.push_back (F); \t} \t 서식 <유형 이름 ... TArgs> \t 공극 호출 (TArgs && ... ARG) \t {(자동 F : mListOfFunctions) 용 \t \t \t \t { \t \t \t F (표준 : 앞으로 (arg) ...); \t \t} \t} }; 하지만 Bind를 호출하면 오류가 다시 발생합니다. –

관련 문제