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调用上下文中的“this”将具有MyTable类型。

显然不是这样,这是为什么呢?

4

2 回答 2

6

没有。static type确实是Table<Cell>。由于您没有虚拟方法,因此您甚至无法访问dynamic type.MyTable

考虑一下:基类将为直接构造或作为派生类型的所有实例Table<Cell>生成相同的代码。getCell那么它如何取决于类型MyTable

于 2013-04-24T06:44:38.367 回答
1

我会天真地认为,因为它是调用 getCell 的 MyTable 实例,所以在 getCell 调用的上下文中的“this”将具有 MyTable 类型。

编译器应该如何知道MyTable它何时编译Table

显然不是这样,这是为什么呢?

因为不可能。

this是封闭类的类型。

于 2013-04-24T06:47:53.377 回答