2012-03-29 22 views
4

ファンクタを汎用関数にしたいが、コンパイラエラーが出る。可変関数テンプレート関数

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; 
} 

私は2番目の文で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はまだ私はバグであると信じている、コンパイルすることを拒否++グラム、それが打ち鳴らす++ 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 –

関連する問題