Bagaimana untuk menyelesaikan ralat kompilasi C++: 'tiada padanan untuk panggilan ke 'fungsi'?

WBOY
Lepaskan: 2023-08-25 21:01:52
asal
2687 orang telah melayarinya

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

Penyelesaian kepada ralat kompilasi C++: 'tiada padanan untuk panggilan ke 'fungsi', bagaimana untuk menyelesaikannya?

Apabila membangun menggunakan bahasa pengaturcaraan C++, kita pasti akan menghadapi pelbagai ralat kompilasi. Salah satu ralat biasa ialah "tiada padanan untuk panggilan ke 'fungsi'". Ralat ini biasanya berlaku apabila kita cuba memanggil objek fungsi. Artikel ini akan menerangkan punca ralat ini dan menyediakan beberapa penyelesaian.

Mula-mula, mari lihat contoh mudah ralat ini:

#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;
}
Salin selepas log masuk

Dalam contoh di atas, kami telah menentukan kelas yang dipanggil MyFunctor yang melebihkan operator panggilan fungsi< code>operator(), dan keluarkan mesej dalam fungsi. Dalam fungsi main, kami mencipta objek myFunctor jenis MyFunctor dan cuba melaksanakan operasi fungsi dengan memanggil objek ini. Walau bagaimanapun, apabila kami cuba menyusun kod ini, kami menghadapi ralat kompilasi di atas. 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;
    }
};
Salin selepas log masuk

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

Sebab ralat ini ialah pengkompil C++ tidak dapat mencari fungsi yang sepadan untuk melaksanakan panggilan ke objek fungsi. Apabila kita cuba memanggil objek fungsi, pengkompil mencari fungsi dengan operator panggilan fungsi terlampau beban yang sepadan dengan jenis hujah panggilan. Jika tiada fungsi sepadan ditemui, pengkompil akan melaporkan ralat.
  1. Untuk menyelesaikan ralat ini, kita boleh mengambil pendekatan berikut:
    1. Tambah fungsi terlampau beban tambahan dalam kelas objek fungsi: Menurut contoh kami, kami boleh Tambah fungsi terlampau beban yang menerima const</code > parameter diubah suai: <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">Salin selepas log masuk</div></div></li>Dalam kes ini, kita boleh mengelakkan kompilasi dengan menghantar parameter menggunakan kesilapan rujukan <code>const. Contohnya:
    int main() {
        MyFunctor myFunctor;
        myFunctor(static_cast<int>(10));  // 显式转换类型为 int
        return 0;
    }
    Salin selepas log masuk

    Tukar jenis data parameter secara eksplisit: Jika kami tidak boleh mengubah suai kelas objek fungsi, atau tidak mahu menambah fungsi terlampau beban tambahan dalam kelas, kami boleh cuba menukar jenis data secara eksplisit parameter. Sebagai contoh, kita boleh menukar jenis parameter panggilan kepada jenis yang diterima oleh fungsi objek lebihan fungsi:

    int main() {
        MyFunctor myFunctor;
        void (MyFunctor::*functionPtr)(int) = &MyFunctor::operator();
        (myFunctor.*functionPtr)(10);  // 通过函数指针间接调用函数对象的函数调用操作符
        return 0;
    }
    Salin selepas log masuk
    🎜🎜Ubah suai cara panggilan: Jika kita tidak dapat melakukan penukaran jenis data, kita boleh cuba mengubah suai cara memanggil. Sebagai contoh, kita secara tidak langsung boleh memanggil operator panggilan fungsi objek fungsi dengan menggunakan penuding fungsi: 🎜🎜rrreee🎜Dengan salah satu kaedah di atas, kita boleh berjaya menyelesaikan ralat kompilasi "tiada padanan untuk panggilan ke 'fungsi'" dan laksanakan fungsi dengan lancar Operator panggilan fungsi objek. 🎜🎜Untuk meringkaskan, apabila kita memanggil objek fungsi dalam C++, jika kita menghadapi ralat kompilasi "tiada padanan untuk panggilan ke 'fungsi'", kita boleh cuba menambah fungsi terlampau beban tambahan, menukar jenis data parameter secara eksplisit, atau Ubah suai kaedah panggilan untuk menyelesaikan masalah ini. Saya harap kandungan artikel ini dapat membantu anda. Selamat mengekod!🎜

    Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan ralat kompilasi C++: 'tiada padanan untuk panggilan ke 'fungsi'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    sumber:php.cn
    Kenyataan Laman Web ini
    Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
    Tutorial Popular
    Lagi>
    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan