次のようなクラスがあります。
class ClassA
{
public:
float Get(int num) const;
protected:
float& Get(int num);
}
クラスの外では、Get() 関数を呼び出します。
float foo = classAInstance.Get(i);
これで公開バージョンが呼び出されることを期待していますが、代わりに Visual Studio でエラーが発生します。
error C2248: 'ClassA::Get' : cannot access protected member declared in class 'ClassA'
保護されたオーバーロードをコメント アウトし、それへのすべての参照を削除すると、コードがコンパイルされます。
アクセス可能なメンバーが利用可能な場合、コンパイラがアクセスできないメンバーを使用しようとするのはなぜですか? コンパイラに正しいオーバーロードを強制的に選択させる方法はありますか? メンバー関数の解決規則への参照はどこにありますか?