2016-08-22 1 views
-4

Je l'ai vu la syntaxe exacte que je suis en train avec un void function, mais je ne peux pas comprendre pourquoi il ne fonctionne pas dans mon code:std :: carte Initialiser dans un appel à un constructeur de classe

constructeur:

class Input 
{ 
public: 
    Input(const std::map<std::string, void(*)(void)> &arg_0) 
     { //...code...// } 
}; 

Appel au constructeur avec un std temporaire :: carte:

Input _Input(
    std::map<std::string, void(*)(void)> { 
     {"exit", [](){exit(1);}} 
    } 
); 

aussi, juste le moindre changement à

std::map<std::string, void(*)(void)> NAME = { 
    {"exit", [](){exit(1);} 
} 

est suffisant pour résoudre le problème, et pour une raison quelconque, NAME est également hors de portée (ce qui est ce que je veux). Donc, fondamentalement, je connais la solution, mais je veux savoir pourquoi le premier code ne fonctionne pas. P.S. L'erreur est error: expected ‘)’ before ‘{’ token IN std::map<std::string, void(*)(void)> {

EDIT:

Je vois, la manière exacte que j'appelle le constructeur est apparemment importante:

class BackEnd 
{ 
private: 
    Input _Input(
    std::map<std::string, void(*)(void)> { 
     {"exit", [](){exit(1);}} 
    } 
); 
}; 

Dans ce cas, il cesse de fonctionner et renvoie une erreur. Exemple: https://ideone.com/ikGUGF

+1

http://cpp.sh/4utj4? – tkausl

+0

@tkausl Je vois, hmm, je vais vérifier mon code. – areuz

+0

Quel compilateur utilisez-vous? –

Répondre

0
  1. La solution était d'utiliser la nouvelle syntaxe d'initialisation uniforme au lieu de l'ancienne initialisation de l'objet. Aucune idée pourquoi, peut-être quelqu'un pourrait clarifier.

  2. Cela fait beaucoup de bas-voix pour une question légitime personne a pu répondre.

1

The solution was to use the new Uniform Initialization syntax instead of the old Object Initialization. No Idea why, maybe someone could clarify.

Il me semble most vexing parse problem.

En effet, dans votre code:

Input _Input(
    std::map<std::string, void(*)(void)> { 
    // -----------------------------------^ 
     {"exit", [](){exit(1);}} 
    } 
); 

Input _Input(...) pourrait être interprété comme une définition de fonction, et ainsi, puisque la norme, le compilateur fait.

Cette thèse est renforcée par l'erreur:

error: expected ‘)’ before ‘{’ token 

Ce que le compilateur attend un ) afin de fermer la signature de la fonction.

Comme vous l'avez déjà constaté, une solution consiste à utiliser la syntaxe d'initialisation uniforme. Cela parce que le code n'est pas plus ambigu.


That's a lot of down-votes for a legitimate question that nobody was able to answer.

Je suis d'accord avec vous juste pour le fait d'un bas-voix devrait impliquer un commentaire afin d'améliorer une question elle-même.

En tout cas j'espère que vous pouvez trouver utile cette réponse.

+0

En effet, cela semble être le cas. Je vous remercie :) – areuz