Heim > Backend-Entwicklung > C++ > Wie behebt man den C++-Kompilierungsfehler: „Keine Übereinstimmung für Aufruf von „Funktion''?

Wie behebt man den C++-Kompilierungsfehler: „Keine Übereinstimmung für Aufruf von „Funktion''?

WBOY
Freigeben: 2023-08-25 21:01:52
Original
2743 Leute haben es durchsucht

解决C++编译错误:'no match for call to 'function'',如何解决?

C++-Kompilierungsfehler beheben: „Keine Übereinstimmung für Aufruf von „Funktion“, wie lässt sich das Problem beheben?

Bei der Entwicklung mit der Programmiersprache C++ treten zwangsläufig verschiedene Kompilierungsfehler auf. Einer der häufigsten Fehler ist „Keine Übereinstimmung für Aufruf von ‚Funktion‘“. Dieser Fehler tritt normalerweise auf, wenn wir versuchen, ein Funktionsobjekt aufzurufen. In diesem Artikel werden die Ursachen dieses Fehlers erläutert und einige Lösungen bereitgestellt.

Schauen wir uns zunächst ein einfaches Beispiel für diesen Fehler an:

#include <iostream>

class MyFunctor {
public:
    void operator()(int x) {
        std::cout << "Hello world! The value of x is: " << x << std::endl;
    }
};

int main() {
    MyFunctor myFunctor;
    myFunctor(10);  // 编译错误发生在这里
    return 0;
}
Nach dem Login kopieren

Im obigen Beispiel haben wir eine Klasse namens MyFunctor definiert, die den Funktionsaufrufoperator < code>operator() und geben Sie eine Nachricht in der Funktion aus. In der Funktion main erstellen wir ein Objekt myFunctor vom Typ MyFunctor und versuchen, Funktionsoperationen durch Aufrufen dieses Objekts auszuführen. Wenn wir jedoch versuchen, diesen Code zu kompilieren, stoßen wir auf den oben genannten Kompilierungsfehler. MyFunctor的类,它重载了函数调用操作符operator(),并在该函数中输出一条消息。在main函数中,我们创建了一个MyFunctor类型的对象myFunctor,并尝试通过调用这个对象来执行函数操作。然而,当我们尝试编译这段代码时,就会遇到上述的编译错误。

这个错误的原因是,C++编译器无法找到匹配的函数来执行对函数对象的调用。当我们尝试调用一个函数对象时,编译器会查找一个与调用参数类型匹配的重载了函数调用操作符的函数。如果找不到匹配的函数,编译器就会报错。

要解决这个错误,我们可以采取以下几种方法:

  1. 在函数对象的类中添加额外的重载函数:根据我们的示例,我们可以为MyFunctor类添加一个接受const修饰的参数的重载函数:
class MyFunctor {
public:
    void operator()(int x) {
        std::cout << "Hello world! The value of x is: " << x << std::endl;
    }

    void operator()(const int& x) {
        std::cout << "Hello world! The value of x is (const ref): " << x << std::endl;
    }
};
Nach dem Login kopieren

在这种情况下,我们可以通过使用一个const

Der Grund für diesen Fehler ist, dass der C++-Compiler keine passende Funktion finden kann, um den Aufruf des Funktionsobjekts durchzuführen. Wenn wir versuchen, ein Funktionsobjekt aufzurufen, sucht der Compiler nach einer Funktion mit einem überladenen Funktionsaufrufoperator, der dem Aufrufargumenttyp entspricht. Wenn keine passende Funktion gefunden wird, meldet der Compiler einen Fehler.
  1. Um diesen Fehler zu beheben, können wir die folgenden Ansätze verfolgen:
    1. Fügen Sie zusätzliche überladene Funktionen in der Klasse des Funktionsobjekts hinzu: Gemäß unserem Beispiel können wir eine überladene Funktion hinzufügen, die einen const</code akzeptiert > geänderter Parameter: <ol start="3"><li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:cpp;toolbar:false;'>int main() { MyFunctor myFunctor; myFunctor(10); // 调用重载函数 void operator()(const int&amp; x) return 0; }</pre><div class="contentsignin">Nach dem Login kopieren</div></div></li>In diesem Fall können wir die Kompilierung vermeiden, indem wir den Parameter mit einem <code>const-Referenzfehler übergeben. Beispiel:
    int main() {
        MyFunctor myFunctor;
        myFunctor(static_cast<int>(10));  // 显式转换类型为 int
        return 0;
    }
    Nach dem Login kopieren

    Konvertieren Sie den Datentyp des Parameters explizit: Wenn wir die Klasse des Funktionsobjekts nicht ändern können oder der Klasse keine zusätzlichen überladenen Funktionen hinzufügen möchten, können wir versuchen, den Datentyp von explizit zu konvertieren der Parameter. Beispielsweise können wir den Typ des aufrufenden Parameters in den Typ konvertieren, der von der überladenen Funktion des Funktionsobjekts akzeptiert wird:

    int main() {
        MyFunctor myFunctor;
        void (MyFunctor::*functionPtr)(int) = &MyFunctor::operator();
        (myFunctor.*functionPtr)(10);  // 通过函数指针间接调用函数对象的函数调用操作符
        return 0;
    }
    Nach dem Login kopieren
    🎜🎜Ändern Sie die Art des Aufrufs: Wenn wir keine Datentypkonvertierung durchführen können, können wir versuchen, die Art des Aufrufs zu ändern Berufung. Beispielsweise können wir den Funktionsaufrufoperator eines Funktionsobjekts indirekt aufrufen, indem wir einen Funktionszeiger verwenden: 🎜🎜rrreee🎜Mit einer der oben genannten Methoden können wir den Kompilierungsfehler „Keine Übereinstimmung für Aufruf von ‚Funktion‘“ erfolgreich lösen und Führen Sie die Funktion reibungslos aus. Der Funktionsaufrufoperator des Objekts. 🎜🎜Um es zusammenzufassen: Wenn wir beim Aufrufen eines Funktionsobjekts in C++ auf einen Kompilierungsfehler „Keine Übereinstimmung für Aufruf von ‚Funktion‘“ stoßen, können wir versuchen, zusätzliche überladene Funktionen hinzuzufügen, den Datentyp des Parameters explizit zu konvertieren oder Ändern Sie die aufrufende Methode, um dieses Problem zu lösen. Ich hoffe, der Inhalt dieses Artikels kann Ihnen helfen. Viel Spaß beim Codieren!🎜

    Das obige ist der detaillierte Inhalt vonWie behebt man den C++-Kompilierungsfehler: „Keine Übereinstimmung für Aufruf von „Funktion''?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Quelle:php.cn
    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage