私はこれをC++でやろうとしています:
class Abc
{
int callFunction1()
};
void function1(Abc** c1) {//do something}
int Abc::callFunction1()
{
function1(&this);
return 0;
}
また、Visual Studio 2015で「式はL値または関数指定子である必要があります」というエラーが表示されます。そのため、どこが間違っているのかわかりません。私の知る限り、 &this
のタイプはAbc**
正しい?
関数の定義は私のものではありません。したがって、パラメーターの種類を変更することはできません。
エラーは十分に明確です。 this
は左辺値ではないため、そのアドレスを取得することはできません。オブジェクトのアドレスだけが必要な場合は、&this
ではなくthis
を渡し、関数宣言を次のように変更します。
void function1(Abc* c1) //To just pass a pointer
ただし、関数の定義は変更できないと述べたので、一時変数を作成してそのアドレスを渡すことができます。
auto temp = this;
function1(&temp);
仕組み:
式this
は右辺値であり、式137
または'a'
と同じなので、そのアドレスを取得することはできません。
this
へのポインターへのポインターを取得する場合は、正しい型の新しい変数を作成する必要があります。
auto* ptr = this;
doSomething(&ptr);
C++標準から(9.2.2.1 thisポインター)
1非静的(9.2.1)メンバー関数の本体では、キーワードthisはprvalue式ですであり、その値は関数が呼び出されるオブジェクトのアドレスです。
および(5.3.1単項演算子)
3単項&演算子の結果は、そのオペランドへのポインターです。 オペランドは左辺値にする必要がありますまたは修飾ID ...
より明確にするために、次のコードスニペットを検討してください。
たとえば、宣言がある場合
int x = 10;
その後、あなたは書くことはできません
int **p = &&x;
右の式では、&x
はprvalue
であり、規格の2番目の引用によれば、単項演算子&
をprvalue
に適用することはできません。
あなたは書くことができます
int *q = &x;
int **p = &q;
q
はlvalue
であるためです。