は、私のコードの例です:演算子オーバーロード - ここ>
class X
{
public:
void f() {}
};
class Y : public X
{
public:
X& operator->() { return *this; }
void f() {}
};
int main()
{
Y t;
t.operator->().f(); // OK
t->f(); // error C2819: type 'X' does not have an overloaded member 'operator ->'
// error C2232: '->Y::f' : left operand has 'class' type, use '.'
}
なぜコンパイラは、XにYから> operator-について「責任を動かす」しようとしていますか?私はX :: op->を実装すると、そこにXを返すことができません - コンパイルエラーはXからいくつかのZを返す間に "無限再帰"と言います:: op->再びZは演算子 - >を持たないので、階層的に高い
誰もこの興味深い行動を説明できますか? :)
私は 'それは' operator->をサポートするためのニーズを返すものは何でもちょうどこと、ポインタを返すと仮定だと言うではないでしょう。 – GManNickG
@ GMan-良い点。私はここで簡単にするつもりだったが、あなたは正しい。このテクニックに依存しているスマートポインタを使用して、実際に楽しむことができるトリックがあります。 – templatetypedef
@GMan:そのような型はまとめて*スマートポインタ*と呼ばれるので、templatypypedefは* pointer *という用語を使うのは間違っているとは思いません。 –