C ++模板和指向不完整类型的指针

时间:2016-04-23 18:19:02

标签: c++ templates

编译器如何知道obj的样子?它不包含在form.h中,但无论如何都可以使用。

form.h

#ifndef FORM_H
#define FORM_H

template <class T>
class Form
{
public:
    Form(T* obj) {}
};

#endif // FORM_H

mainwindow.cpp

#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;
}

1 个答案:

答案 0 :(得分:2)

编译器知道obj的外观,因为T*obj是一个指针,编译器会密切了解所有指针的外观。

处理T时,无需了解T*的内容。

如果你要取消引用该指针并使用它指向的T,在类定义中,那么是T的定义必须是可用的。但无论如何,这保证是真的,因为任何实例化Form<T>的代码必须至少知道所选择的T是一个类。除此之外,所有关于前瞻性声明的通常规则都适用。