Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;指向不完整类型的模板和指针_C++_Templates - Fatal编程技术网

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

C++ C++;指向不完整类型的模板和指针,c++,templates,C++,Templates,编译器如何知道obj的外观?它没有包含在form.h中,但它仍然有效 表格h #ifndef表单 #定义表单 样板 班级形式 { 公众: 表格(T*obj){} }; #endif//FORM_H mainwindow.cpp #包括“mainwindow.h” #包括“ui_main window.h” 主窗口::主窗口(QWidget*父窗口): QMainWindow(父级), 用户界面(新用户界面::主窗口) { 用户界面->设置用户界面(此); 表格=新表格(本); } MainWi

编译器如何知道obj的外观?它没有包含在
form.h
中,但它仍然有效

表格h
#ifndef表单
#定义表单
样板
班级形式
{
公众:
表格(T*obj){}
};
#endif//FORM_H
mainwindow.cpp
#包括“mainwindow.h”
#包括“ui_main window.h”
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
表格=新表格(本);
}
MainWindow::~MainWindow()
{
删除用户界面;
}

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

它不需要知道
t
是什么样子,就可以处理
t*


如果要取消对该指针的引用,并在类定义中使用它指向的
T
,则必须提供
T
的定义。但无论如何这都是肯定的,因为实例化
表单
的任何代码至少必须知道所选的
T
是一个类。除此之外,所有关于远期声明的常规规则都适用。

我已经尽我所能回答了,但是如果没有更好地描述“什么
obj
看起来像”你感兴趣的部分,这个问题就有点不清楚了。这段代码涉及几个有趣的方面,我们不知道您关心哪些方面。
#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;
}