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

C++ templates and pointers to incomplete types

本文关键字:类型 指针 C++      更新时间:2023-10-16

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

表格.h

#ifndef FORM_H
#define FORM_H
template <class T>
class Form
{
public:
    Form(T* obj) {}
};
#endif // FORM_H

主窗口.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;
}
编译器

知道obj是什么样子的,因为作为一个T*obj是一个指针,编译器非常清楚所有指针的样子。

它不需要知道T长什么样,就可以处理T*

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