1. ホーム
  2. c++

[解決済み] このアドレスの取得時に "expression must be an l-value or function designator" エラーが発生する。

2022-02-15 21:26:10

質問

C++でこれをやろうとしています。

class Abc
{
   int callFunction1()
};

void function1(Abc** c1) {//do something}

int Abc::callFunction1()
{
   function1(&this);
   return 0;
}

そして、Visual Studio 2015で"expression must be an l-value or function designator"のエラーが発生します。だから、私はどこに間違って行くのか理解できません。私の知る限りでは &this という型でなければなりません。 Abc** ということですよね?

関数の定義は、私が変更できるものではありません。だから、パラメータの型を変えることはできないんだ。

どうすればいいですか?

エラーは十分に明確です。ということは this は lvalue ではないので、そのアドレスを取得することはできません。もしオブジェクトのアドレスが欲しいだけなら、単に this ではなく &this と、関数宣言を変更します。

void function1(Abc* c1) //To just pass a pointer

しかし、関数の定義を変更できないとのことなので、一時変数を作ってそのアドレスを渡せばよいでしょう。

auto temp = this;
function1(&temp);

この仕組み

  1. 以来 this で、そのアドレスを取得することはできません。これを lvalue に変換するには、それを指し示すものが必要で、ここでは temp .
  2. これで temp を指しています。 this を取る。 temp のアドレスは、実質的に this のアドレスを、間接的にではありますが、指定します。
  3. したがって、lvalueのアドレスを function1 ということで、コードは期待通りにコンパイルされ動作します。