编译器如何知道obj
的样子?它不包含在form.h
中,但无论如何都可以使用。
#ifndef FORM_H
#define FORM_H
template <class T>
class Form
{
public:
Form(T* obj) {}
};
#endif // FORM_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
form = new Form<MainWindow>(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
答案 0 :(得分:2)
编译器知道obj
的外观,因为T*
,obj
是一个指针,编译器会密切了解所有指针的外观。
处理T
时,无需了解T*
的内容。
如果你要取消引用该指针并使用它指向的T
,在类定义中,那么是T
的定义必须是可用的。但无论如何,这保证是真的,因为任何实例化Form<T>
的代码必须至少知道所选择的T
是一个类。除此之外,所有关于前瞻性声明的通常规则都适用。