我的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]
我会天真地想,因为它是一个 MyTable 实例,调用 getCell ,“此”在 getCell 调用的上下文中会有输入 MyTable 。
显然不是这样,为什么会这样?
答案 0 :(得分:6)
不。 static type
确实是Table<Cell>
。由于您没有虚拟方法,因此您甚至无法访问dynamic type
的{{1}}。
考虑这一点:基类MyTable
将为直接构造的所有实例或派生类型生成Table<Cell>
的相同代码。那么它如何取决于类型getCell
?
答案 1 :(得分:1)
我会天真地想,因为它是一个调用getCell的MyTable实例,在getCell调用的上下文中,“this”将具有MyTable类型。
编译器在编译MyTable
时应该如何知道Table
?
显然不是这样,为什么会这样?
因为它不可能。
this
是封闭类的类型。