2012-03-29 66 views
4

我想使泛函函數,但我得到編譯器錯誤。 下面是代碼:函子到variadic模板函數

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:固定的感謝。 – 2012-03-29 09:07:09

+5

在我看來,你正試圖複製'std :: make_shared'。是對的嗎? – 2012-03-29 10:04:37

+0

@TamásSzelei:這只是我實際應用中的蒸餾例子。此代碼將成爲對象工廠的一部分,它將根據提供的密鑰返回基本類型的智能指針。下面的答案是我想看到的。 – 2012-03-29 12:02:40

回答

4

如果需要模板函數的指針,則必須首先實例化模板。

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

這將使它在鏗鏘語++ 3.1上編譯,但g ++ 4.8仍然拒絕編譯,我相信這是一個錯誤。

你可以提供一個lambda函數:

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

謝謝。我實際上嘗試了你的第一個解決方案,但沒有懷疑編譯器。鏗鏘3.0也編譯此代碼。我會向GCC發佈一個錯誤報告。 – 2012-03-29 12:04:44

+1

Bugreport:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52768 – 2012-03-29 12:34:13