2017-03-15 4 views
1

J'essaie de trouver ce que g ++ paramètres compilateur à utiliser pour compiler cet exemple C++ code:Est-il possible d'utiliser functor comme paramètre de template pour std :: function?

#include <stdio.h> 
#include <functional> 

struct mystruct 
{ 
    int a; 
    int operator()(int y) { return y + 1; } 
}; 

int main() 
{ 
    std::function<mystruct> foo; 
    return 0; 
} 

En ce qui concerne cpp est écrit que paramètre de modèle std :: fonction peut être « ... ou d'autres objets de la fonction » . Je travaille sur un grand projet contenant plusieurs fonctions std :: et le projet peut être construit avec g ++. Je suis en train de le construire sous VS2015 mais compilateur sur un tel code se plaint:

erreur C2027: utilisation de type non défini 'std :: _ Get_function_impl < _Fty>' avec [ _Fty = mystruct ]

quand Je tente de compiler petit échantillon ci-dessus sous g ++ avec std = C++ 11 il comlains aussi:

erreur: global « std :: fonction d'un » a un type incomplet et ne peut pas être définie

Je pense que dans notre grand Le projet buildable g ++ a probablement changé d'extension qui fournit une telle capacité.

+2

Où voyez-vous que le paramètre template peut être autre chose qu'un type de fonction (par exemple, int (double, char) ')? cppreference dit qu'il peut * stocker * des objets de fonction. Quoi qu'il en soit, que ferait-il si 'mystruct' avait plus d'une surcharge' operator() 'ou si' operator() 'était modélisé? il ne peut pas effacer de manière sécurisée une signature d'appel. – chris

Répondre

3

Vous avez probablement mélangé l'argument template avec un objet fonction à stocker. Je crois que ce que vous vouliez écrire est

std::function<int(int)> foo{mystruct{}}; 
0

La réponse est que le foncteur ne peut pas être le paramètre de modèle à l'autre foncteur. Merci pour tous les messages.