2017-10-20 5 views
1

Ich habe ähnliche Fragen gestellt und ihre Lösungen versucht, aber die Antworten auf sie scheinen nicht zu funktionieren. Ich habe den folgenden Code:Kein passender Funktionsaufruf Aufruf zum Konstruktor in Header-Datei

.h

#include <iostream> 
#include <vector> 
#include <string> 
using std::string; using std::vector; 

struct DialogueNode; 

struct DialogueOption { 
    string text; 
    DialogueNode *next_node; 
    int return_code; 

    DialogueOption(string t, int rc, DialogueNode * nn) : text{t}, 
     return_code{rc}, next_node{nn} {} 
}; 

struct DialogueNode { 
    string text; 
    vector <DialogueOption> dialogue_options; 
    DialogueNode(); 
    DialogueNode(const string &); 
}; 

struct DialogueTree { 
    DialogueTree() {} 
    void init(); 
    void destroyTree(); 

    int performDialogue(); 
private: 
    vector <DialogueNode*> dialogue_nodes; 
}; 

CPP

#include "dialogue_tree.h" 

DialogueNode::DialogueNode(const string &t) : text{t} {} 

void DialogueTree::init() { 
    string s = "Hello"; 
    for(int i = 0; i < 5; i++) { 
     DialogueNode *node = new DialogueNode(s); 
     dialogue_nodes.push_back(node); 
     delete node; 
    } 
} 

void DialogueTree::destroyTree() { 

} 

int DialogueTree::performDialogue() { 
    return 0; 
} 

int main() { 
    return 0; 
} 

ich den Fehler: error: no matching function for call to ‘DialogueNode:: DialogueNode(std::__cxx11::string&)’ DialogueNode *node = new DialogueNode(s);

EDIT zusätzliche Hinweise auf Fehler

dialogue_tree.h:17:8: note: candidate: DialogueNode::DialogueNode() 
dialogue_tree.h:17:8: note: candidate expects 0 arguments, 1 provided 
dialogue_tree.h:17:8: note: candidate: DialogueNode::DialogueNode(const DialogueNode&) 
dialogue_tree.h:17:8: note: no known conversion for argument 1 from ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ to ‘const DialogueNode&’ 
dialogue_tree.h:17:8: note: candidate: DialogueNode::DialogueNode(DialogueNode&&) 
dialogue_tree.h:17:8: note: no known conversion for argument 1 from ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ to ‘DialogueNode&&’ 

Das macht für mich keinen Sinn, weil ich den Konstruktor definiert habe, um ein string als ein Argument zu nehmen.

+0

Könnte nicht verwandt sein, aber was ist 'dialog_nodes'? Sieht so aus, als hättest du den _relevanten_ Code nicht angezeigt – P0W

+0

@ P0W es ist ein Vektor von 'DialogueNode' Zeigern in der' DialogueTree' Klasse Ich werde diesen Snipper Code auch anhängen – quantik

+2

Das Beste kann ich mit unvollständigem Code tun, [kann nicht reproduzieren] (https://wandbox.org/permlink/QnxPYc3STZWa9XSx). – chris

Antwort

2

Sie haben Ihren Konstruktor deklariert als:

DialogueNode(const string); 

Aber es wie folgt definiert:

DialogueNode(const string &t); 

Die beiden sind nicht die gleichen; der erstere nimmt eine während die letztere eine Referenz nimmt. Sie verlassen nun die & geben Sie eine Referenz Argument hinzufügen:

DialogueNode(const string &); 
+0

das gibt den gleichen Fehler – quantik

+0

Aha, Sie hatten gerade die '&' in Ihrer Bearbeitung hinzugefügt. – frslm

+0

Yeah ursprünglich war ich nicht als Referenz und es gab mir das gleiche Problem. Ich entschied mich für diese Änderung und aktualisierte das Programm nicht vollständig. Dies behebt das Problem nicht - leider .. – quantik

1

es ist, weil in den Konstruktor geben Sie an, dass der Parameter eine Reihe von konstanten Typ sein wird, und wenn Sie ein Objekt erstellen Sie eine Zeichenfolge sind vorbei . Der Typenkonflikt ist das Problem, entweder den Konstruktorparameter in einer Zeichenfolge fixieren oder ändern, wenn Sie ein Objekt erstellen.

+0

Ich aktualisierte das Problem, das das Problem leider nicht behebt – quantik

+2

Nicht-Konstanten können const-Parameter (ob der Parameter eine Referenz oder nicht ist) übereinstimmen. Dies ist kein Problem. – aschepler

+0

Danke für das Hinzufügen in meinem Wissen! –

Verwandte Themen