2012-03-29 3 views
4

일반 함수에 functor를 만들고 싶지만 컴파일러 오류가 발생합니다.가변 인자 템플릿 함수 Functor to

template <class T> 
struct Creator 
{ 
    template <typename...Ts> 
    static std::shared_ptr<T> create(Ts&&... vs) 
    { 
     std::shared_ptr<T> t(new T(std::forward<Ts>(vs)...)); 
     return t; 
    } 
}; 

class Car: 
     public Creator<Car> 
{ 
    private: 
     friend class Creator<Car>; 
     Car() 
     { 
     } 
}; 

int main() 
{ 
    auto car=Car::create(); 
    std::function< std::shared_ptr<Car>() > createFn=&Car::create; 

    return 0; 
} 

나는 두 번째 문에 GCC 4.6.3에서 다음 오류 (첫 번째는 OK입니다) : 모든 힌트 감사

error: conversion from ‘<unresolved overloaded function type>’ 
     to non-scalar type ‘std::function<std::shared_ptr<Car>()>’ requested 

다음은 코드입니다.

+0

@NicolBolas을 : 고정 감사합니다. –

+5

'std :: make_shared'를 복제하려고하고있는 것 같습니다. 그게 맞습니까? –

+0

@ TamásSzelei : 이것은 실제 응용 프로그램에서 나온 예입니다. 이 코드는 제공되는 키를 기반으로 기본 유형의 스마트 포인터를 반환하는 객체 팩토리의 일부입니다. 아래의 대답은 제가보고 싶었던 것입니다. –

답변

4

템플릿 함수의 포인터가 필요한 경우 템플릿을 먼저 인스턴스화해야합니다.

std::function<std::shared_ptr<Car>()> createFn = &Car::create<>; 

이 4.8 여전히 나는 버그가 믿는, 컴파일을 거부 ++ g가 그 소리 ++ 3.1 컴파일 할 만합니다.

는 대신 람다 기능을 제공 할 수있다 :

std::function<std::shared_ptr<Car>()> createFn = []{ return Car::create(); }; 
+0

고맙습니다. 사실 첫 번째 해결책을 시도했지만 컴파일러를 조금 의심하지는 않았습니다. Clang 3.0은 또한이 코드를 컴파일합니다. 나는 GCC에 버그 보고서를 만들 것이다. –

+1

버그 리포트 : http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52768 –