IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

fonctions lambda et capture de paramètres


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Par défaut fonctions lambda et capture de paramètres
    Bonjour à tous,

    Je suis face à un problème plus que basique mais où je sèche...

    J'ai une classe avec une méthode me servant à procéder à un traitement suite à la réception de data.
    Le code suivant fonctionne sans problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    //----------------------------------
    bool										MCU::handleApplicationRequests(std::shared_ptr<Action> &action, std::shared_ptr<Channel> channel, const bool &hasToLock)
    //----------------------------------
    {
    	const std::string		&actionCode	= action->getDataAsString("actionCode");
    	const std::string		&method		= action->getMethod();
     
    	if (method == "dump")	{
    		Utils::log(Logger::LEVEL::DEBUG, "Method: [%s]", method.c_str());
    		this->_channels->dump();
    		this->_conferences->dump();
    	}
    	else if (method == "X")									this->handleXMessage(action);
    	...
    	return true;
    }
    Cependant le code suivant non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    //----------------------------------
    bool										MCU::handleApplicationRequests(std::shared_ptr<Action> &action, std::shared_ptr<Channel> channel, const bool &hasToLock)
    //----------------------------------
    {
    	boost::asio::post(this->_threadPool, [action, channel, hasToLock, this] () {
    		const std::string		&actionCode	= action->getDataAsString("actionCode");
    		const std::string		&method		= action->getMethod();
     
    		if (method != "ActionHeartbeatMcuDTO")		action->dump();
     
    		if (method == "dump")	{
    			Utils::log(Logger::LEVEL::DEBUG, "Method: [%s]", method.c_str());
    			this->_channels->dump();
    			this->_conferences->dump();
    		}
    		else if (method == "X")									this->handleXMessage(action);
    		...
     
    	});
    	return true;
    }

    Le message d'erreur est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [root@std1-viapika-archiv3-dev MCU]# make
    g++ -I./includes -I/usr/include/pika -I/usr/local/includes -I/usr/include -I/usr/local/apr/include/apr-1 -I/usr/local/unimrcp/include -Wall -ansi -pedantic -std=gnu++1z -DGP_USE_CALLINFO_EX -DASR_TELISMA -DRESOURCES_DEBUG -g -ggdb  -c mcu.cpp -o mcu.o
    mcu.cpp: In lambda function:
    mcu.cpp:164:74: error: binding reference of type ‘std::shared_ptr<Action>&’ to ‘const std::shared_ptr<Action>’ discards qualifiers
       else if (method == "X")         this->handleXMessage(action);
    J'ai trouvé un workaround qui est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    //----------------------------------
    bool										MCU::handleApplicationRequests(std::shared_ptr<Action> &action, std::shared_ptr<Channel> channel, const bool &hasToLock)
    //----------------------------------
    {
    	boost::asio::post(this->_threadPool, [action2 = action, channel, hasToLock, this] () {
    		std::shared_ptr<Action> action = action2;
    		const std::string		&actionCode	= action->getDataAsString("actionCode");
    		const std::string		&method		= action->getMethod();
     
    		if (method != "ActionHeartbeatMcuDTO")		action->dump();
     
    		if (method == "dump")	{
    			Utils::log(Logger::LEVEL::DEBUG, "Method: [%s]", method.c_str());
    			this->_channels->dump();
    			this->_conferences->dump();
    		}
    		else if (method == "X")									this->handleXMessage(action);
    Est-ce que qqun arriverait à m'expliquer où est le problème et surtout pourquoi je dois passer par une variable intermédiaire?
    Bonne journée

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Par défaut
    Ok je viens de trouver pourquoi... https://mayankj08.github.io/2017/08/...ambdas-In-C++/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonction lambda en paramètre d'une fonction
    Par Kaluza dans le forum Langage
    Réponses: 7
    Dernier message: 05/12/2011, 16h25
  2. cherche une fonction system avec capture de la sortie
    Par ChipsterJulien dans le forum C++
    Réponses: 4
    Dernier message: 28/02/2008, 16h47
  3. Fonction ouvre avec passage de paramètres
    Par nath-0-0 dans le forum WinDev
    Réponses: 4
    Dernier message: 20/11/2006, 12h51
  4. Réponses: 7
    Dernier message: 19/05/2006, 16h47
  5. Fonction avec un recordset en paramètre
    Par Poussy-Puce dans le forum ASP
    Réponses: 1
    Dernier message: 20/01/2006, 20h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo