ホームページ >バックエンド開発 >C++ >`std::set` からメンバー関数にアクセスすると、「passing 'const StudentT' as 'this' argument」エラーが発生するのはなぜですか?

`std::set` からメンバー関数にアクセスすると、「passing 'const StudentT' as 'this' argument」エラーが発生するのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-26 10:55:14574ブラウズ

Why Do I Get

メンバー関数呼び出しの関数修飾に矛盾があります

提供されたコードでは、メンバー関数 getId() および getName() にアクセスするときにエラーが発生します。セットに保存されているオブジェクトからデータ構造。この問題は、オブジェクトの定数性とメンバー関数の修飾との間の不一致に起因します。

これを理解するには、セット内のオブジェクトが const 参照として格納されることを覚えておく必要があります。ただし、メンバー関数 getId と getName は const として宣言されていません。これは、それらがオブジェクトの状態を変更できることを意味します。

エラーが発生する行:

cout << itr->getId() << " " << itr->getName() << endl;

コンパイラは、itr イテレータが const StudentT オブジェクトを指していることを検出しますが、このオブジェクトは定義上変更できません。したがって、const オブジェクトで非 const メンバー関数を呼び出すことは許可されないため、次のようなエラー メッセージが生成されます。

../main.cpp:35: error: passing 'const StudentT' as 'this' argument of 'int StudentT::getId()' discards qualifiers
../main.cpp:35: error: passing 'const StudentT' as 'this' argument of 'std::string StudentT::getName()' discards qualifiers

この問題を解決するには、メンバー関数 getId と getName を const として宣言する必要があります。オブジェクトの状態を変更しないことを示します:

int getId() const {
    return id;
}

string getName() const {
    return name;
}

これらの関数を const にすることで、const で安全に呼び出せることが保証されます。

さらに、演算子

を使用して、定数不一致エラーを排除します。 StudentT クラスのオーバーロードも const:
inline bool operator<(const StudentT &s1, const StudentT &s2) {
    return s1.getId() < s2.getId();
}

として宣言する必要があります。これにより、比較演算で比較対象のオブジェクトの変更が試行されなくなり、コードの正確性が維持されます。

以上が`std::set` からメンバー関数にアクセスすると、「passing 'const StudentT' as 'this' argument」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。