Διαγνωστικά compiler σε C++, Rust και Go — DedSec Project
Διαγνωστικά compiler σε C++, Rust και Go no matching function for call Σημασία Ο compiler δεν βρίσκει υπερφόρτωση που να δέχεται τα ορίσματα. Διάβασε τις υποψήφιες υπογραφές που…
no matching function for call
Σημασία
Ο compiler δεν βρίσκει υπερφόρτωση που να δέχεται τα ορίσματα. Διάβασε τις υποψήφιες υπογραφές που απορρίφθηκαν: πλήθος και σειρά ορισμάτων, namespace, const, αναφορές και περιορισμούς templates.
Ελάχιστο παράδειγμα
#include <iostream>
#include <string_view>
void repeat(std::string_view text, int count) {
for (int i=0; i<count; ++i) std::cout << text << '\n';
}
int main() {
// repeat(2, "hi"); // λάθος σειρά
repeat("hi", 2);
}
Εκτέλεσε g++ -std=c++17 -Wall -Wextra -pedantic example.cpp -o example && ./example. Η διορθωμένη έκδοση τυπώνει δύο φορές hi. Ενεργοποίησε τη λανθασμένη κλήση για να διαβάσεις το diagnostic.
Διαδικασία εντοπισμού
Σύγκρινε πρώτα πλήθος και θέση κάθε ορίσματος με τη δήλωση. Έπειτα εξέτασε τις επιτρεπόμενες μετατροπές. Μια non-const αναφορά δεν δέχεται αυθαίρετο temporary, ενώ μια const αναφορά συχνά το δέχεται. Σε templates διάβασε τα notes για deduction και constraints. Αν η υπογραφή φαίνεται σωστή, έλεγξε ποιο header φορτώνεται και σε ποιο namespace βρίσκεται η συνάρτηση.
Εργαστήριο
Πρόσθεσε overload μόνο με std::string_view που καλεί repeat(text, 1). Έλεγξε και τις δύο κλήσεις. Δοκίμασε repeat("hi", 2.5) με -Wconversion -Werror και παρατήρησε την προειδοποίηση απώλειας ακρίβειας. Κράτησε την αρχική λανθασμένη κλήση ως compile-fail regression test.
Τεκμηρίωση
Σημείωσε έκδοση compiler, flags, αναμενόμενη υπογραφή, λίστα υποψήφιων και τη μικρότερη αλλαγή που διορθώνει το σφάλμα. Μην προσθέτεις casts μόνο για να εξαφανιστεί το μήνυμα χωρίς έλεγχο του συμβολαίου API.
use of deleted function
Γλώσσα / περιβάλλον: C++
Τι σημαίνει
Απαιτείται μέθοδος που έχει διαγραφεί ή δεν μπορεί να παραχθεί.
Πώς διορθώνεται
Έλεγξε ιδιοκτησία, αντιγραφή και μετακίνηση· μη αντιγράφεις unique_ptr.
cargo: failed to select a version
Γλώσσα / περιβάλλον: Rust
Τι σημαίνει
Αποτυγχάνει η επίλυση εκδόσεων εξαρτήσεων.
Πώς διορθώνεται
Έλεγξε Cargo.toml/Cargo.lock και συμβατές εκδόσεις.
cannot use X as Y in argument
Γλώσσα / περιβάλλον: Go
Τι σημαίνει
Μία τιμή δεν ταιριάζει στον αναμενόμενο τύπο ορίσματος Go.
Πώς διορθώνεται
Έλεγξε πραγματικό τύπο, διεπαφή και τυχόν μετατροπή.
imported and not used
Γλώσσα / περιβάλλον: Go
Τι σημαίνει
Ο μεταγλωττιστής απορρίπτει εισαγωγές που δεν χρησιμοποιούνται.
Πώς διορθώνεται
Αφαίρεσε την εισαγωγή ή χρησιμοποίησέ την πραγματικά.