C++ コンパイル エラーを解決する方法: 「'関数' の呼び出しに一致しません」

WBOY
リリース: 2023-08-25 21:01:52
オリジナル
2686 人が閲覧しました

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

C コンパイル エラーの解決策:「'関数' の呼び出しに一致しません。解決方法は?」

C プログラミング言語を使用して開発を行うと、さまざまなコンパイル エラーが避けられません。よくあるエラーの 1 つは、「'関数' の呼び出しに一致しません」です。このエラーは通常、関数オブジェクトを呼び出そうとしたときに発生します。この記事では、このエラーの原因といくつかの解決策を説明します。

まず、このエラーの簡単な例を見てみましょう:

#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;
}
ログイン後にコピー

上の例では、関数呼び出し演算子 # を繰り返す MyFunctor という名前のクラスを定義しました。 ##operator() がロードされ、関数内にメッセージが出力されます。 main 関数では、MyFunctor 型のオブジェクト myFunctor を作成し、このオブジェクトを呼び出して関数操作を実行しようとします。ただし、このコードをコンパイルしようとすると、上記のコンパイル エラーが発生します。

このエラーの理由は、C コンパイラが関数オブジェクトの呼び出しを実行するための一致する関数を見つけられないことです。関数オブジェクトを呼び出そうとすると、コンパイラは呼び出し引数の型と一致するオーバーロードされた関数呼び出し演算子を持つ関数を探します。一致する関数が見つからない場合、コンパイラはエラーを報告します。

このエラーを解決するには、次のアプローチを取ることができます:

    関数オブジェクトのクラスに追加のオーバーロード関数を追加します: この例によれば、
  1. MyFunctor クラスは、const 変更されたパラメーターを受け入れるオーバーロードされた関数を追加します:
  2. 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;
        }
    };
    ログイン後にコピー
この場合、

const を使用してこれを行うことができます。コンパイルエラーを避けるためにパラメータを渡すために引用符を付けます。例:

int main() {
    MyFunctor myFunctor;
    myFunctor(10);  // 调用重载函数 void operator()(const int& x)
    return 0;
}
ログイン後にコピー

    パラメーターのデータ型を明示的に変換します。関数オブジェクトのクラスを変更できない場合、またはオーバーロードされた関数をクラスに追加したくない場合は、次のことを試みることができます。データのパラメータ型を明示的に変換します。たとえば、呼び出しパラメータの型を、関数オブジェクトのオーバーロードされた関数で受け入れられる型に変換できます。
  1. int main() {
        MyFunctor myFunctor;
        myFunctor(static_cast<int>(10));  // 显式转换类型为 int
        return 0;
    }
    ログイン後にコピー
    呼び出し方法を変更します。データ型変換を実行できない場合は、次のようにします。 、呼び出し方法を変更してみることができます。たとえば、関数ポインターを使用して、関数オブジェクトの関数呼び出し演算子を間接的に呼び出すことができます。
  1. int main() {
        MyFunctor myFunctor;
        void (MyFunctor::*functionPtr)(int) = &MyFunctor::operator();
        (myFunctor.*functionPtr)(10);  // 通过函数指针间接调用函数对象的函数调用操作符
        return 0;
    }
    ログイン後にコピー
    上記のいずれかの方法を使用すると、コンパイル エラー「呼び出しに一致しません」を正常に解決できます。 to 'function' 」を実行し、関数オブジェクトの関数呼び出し演算子を正常に実行します。

    要約すると、C で関数オブジェクトを呼び出すときに、「'関数' への呼び出しに一致しません」というコンパイル エラーが発生した場合は、追加のオーバーロードされた関数を追加して、パラメーターのデータ型を明示的に変換することを試みることができます。この問題を解決するには、呼び出しメソッドを変更してください。この記事の内容があなたのお役に立てれば幸いです。コーディングを楽しんでください!

    以上がC++ コンパイル エラーを解決する方法: 「'関数' の呼び出しに一致しません」の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート