10

私はC++でこれをやろうとしています:

class Abc
{
   int callFunction1()
};

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

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

そして、Visual Studio 2015 で「式は左辺値または関数指定子でなければなりません」というエラーが表示されます。そのため、どこが間違っているのかわかりません。私の知る限り、&thisタイプAbc**を正しくする必要がありますか?

関数定義は私が変更するものではありません。したがって、パラメーターの型を変更することはできません。

4

3 に答える 3

9

エラーは十分に明確です。は左辺値ではないためthis、そのアドレスを取得することはできません。オブジェクトのアドレスだけが必要な場合は、thisではなく&thisを渡し、関数宣言を次のように変更します。

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

ただし、関数の定義を変更できないと述べたので、一時変数を作成してそのアドレスを渡すことができます。

auto temp = this;
function1(&temp);

仕組み:

  1. thisprvalueであり、そのアドレスを取得できないため、それを左辺値に変換するには、それを指す何かが必要ですtemp
  2. temp指すようになったthisので、のアドレスを取得すると、間接的ではありますが、temp実質的に のアドレスが取得されます。this
  3. したがって、左辺値のアドレスを に渡すためfunction1、コードはコンパイルされ、期待どおりに動作します。
于 2017-09-20T20:05:33.610 に答える