2014-02-10 4 views
9

Wenn eine Klasse einen Standardkonstruktor hat, kann ich die Instanziierung von std::make_shared auf die gleiche Weise wie ein Zeiger auf eine Funktion verwenden. Dies liegt wahrscheinlich daran, dass die instanziierte Vorlage kompiliert und im Speicher gespeichert werden muss und ihre Adresse vorhanden sein muss.Warum kann ich eine Instanz von std :: make_shared nicht als Zeiger verwenden?

#include <memory> 
#include <functional> 

class DefaultConstructible 
{ 
}; 

typedef std::function<std::shared_ptr<DefaultConstructible>()> Generator; 

int main() 
{ 
    Generator generator(std::make_shared<DefaultConstructible>); 
    std::shared_ptr<DefaultConstructible> defConst = generator(); 

    return 0; 
} 

Aber das Gleiche schlägt fehl, wenn ich einen nicht-trivialen Konstruktor hinzu:

#include <memory> 
#include <functional> 

class FromInt 
{ 
public: 
    FromInt(int a):a_(a){} 
    int a_; 
}; 

typedef std::function<std::shared_ptr<FromInt>(int)> Generator; 

int main() 
{ 
    Generator generator(std::make_shared<FromInt>); 
    std::shared_ptr<FromInt> p = generator(2); 

    return 0; 
} 

ich einen Compiler-Fehler:

error: no matching function for call to 
'std::function<std::shared_ptr<FromInt>(int)>::function(<unresolved overloaded function type>)' 
    Generator g(std::make_shared<FromInt>); 
             ^

Warum ist das so und wie kann ich machen Mein Code kompilieren?

Antwort

9

Sie müssen nur explizit sein, über welchen Konstruktor Sie es verwenden möchten:

Generator generator(std::make_shared<FromInt, int>); 

Die „extra“ Template-Argument (e) entsprechen den Konstruktor Argumente.

+0

Vielen Dank! Ich habe es getestet und es funktioniert! –

Verwandte Themen