0

私の C++ は少し錆びていて、次のサンプルに困惑しています。例は短いので、私の説明よりも明確になると思います。

template <class T>
struct Table
{
    T getCell()
    {
        T c;
        c.setTable(this);
    }
};

struct MyTable;

struct Cell
{
    void setTable(MyTable *tbl)
    {

    }
};

struct MyTable : public Table<Cell>
{

};

int main(int argc, char *argv[])
{

    MyTable t;
    t.getCell();
}

テストについてはhttp://ideone.com/1MhVNcを参照してください。コンパイラは次のように述べています。

prog.cpp: In instantiation of ‘T Table<T>::getCell() [with T = Cell]’:
prog.cpp:30:15:   required from here
prog.cpp:7:9: error: invalid conversion from ‘Table<Cell>* const’ to ‘MyTable*’ [-fpermissive]
prog.cpp:15:10: error:   initializing argument 1 of ‘void Cell::setTable(MyTable*)’ [-fpermissive]
prog.cpp:8:5: warning: no return statement in function returning non-void [-Wreturn-type]

getCellを呼び出すMyTableインスタンスであるため、 getCell呼び出しのコンテキストでの「これ」のタイプはMyTableであると単純に考えます。

どうやらそうではないようですが、それはなぜですか?

4

2 に答える 2

1

これは getCell を呼び出す MyTable インスタンスであるため、getCell 呼び出しのコンテキストでの「これ」は MyTable 型になるのではないかと単純に考えます。

MyTableコンパイラは、いつコンパイルするかをどのように知る必要がありますTableか?

どうやらそうではないようですが、それはなぜですか?

ありえないから。

this囲んでいるクラスの型です。

于 2013-04-24T06:47:53.377 に答える